1. 程式人生 > >springboot2.0.3使用jpa和hibernate的方式配置多數據源(sqlite和mysql)

springboot2.0.3使用jpa和hibernate的方式配置多數據源(sqlite和mysql)

自動 username urn ini sqli tps www 不同的 sqlite數據庫

application.properties配置:

#數據庫配置
mysql.spring.datasource.jdbc-url =jdbc:mysql://127.0.0.1:3306/test
mysql.spring.datasource.username=admin
mysql.spring.datasource.password=123456
mysql.spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#數據庫連接池
mysql.spring.datasource.max-idle=100
mysql.spring.datasource.max
-wait=10000 mysql.spring.datasource.min-idle=5 mysql.spring.datasource.initial-size=5 #sqlite數據庫的配置 sqlite.spring.datasource.jdbc-url = jdbc:sqlite:test.db sqlite.spring.datasource.driver-class-name = org.sqlite.JDBC sqlite.spring.datasource.username = sqlite.spring.datasource.password = #關閉hibernate的自動創建表結構的機制 spring.jpa.hibernate.ddl
-auto=none spring.jpa.show-sql=true

DataSourceConfig:

@Configuration
public class DataSourceConfig {

    @Bean(name = "sqliteDataSource")
    @Qualifier(value = "sqliteDataSource")  //spring裝配bean的唯一標識
    @ConfigurationProperties(prefix = "sqlite.spring.datasource")   //application.properties配置文件中該數據源的配置前綴
public DataSource sqliteDataSource(){ return DataSourceBuilder.create().build(); } @Primary //配置該數據源為主數據源 @Bean(name = "mysqlDataSource") @Qualifier(value = "mysqlDataSource") @ConfigurationProperties(prefix = "mysql.spring.datasource") public DataSource mysqlDataSource(){ return DataSourceBuilder.create().build(); } }
MysqlDataSourceConfig
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryMysql",   //EntityManagerFactory引用
        transactionManagerRef = "transactionManagerMysql",      //transactionManager引用
        basePackages = {"com.xxx.mysql"})
public class MysqlDataSourceConfig {
    /**
     * 註入 mysql數據源
     */
    @Resource(name = "mysqlDataSource")
    private DataSource mysqlDataSource;

    /**
     * 註入JPA配置實體
     */
    @Autowired
    private JpaProperties jpaProperties;

    /**
     *  這裏其實不需要配置數據庫的方言.
     *  像hibernate.hbm2ddl.auto 可以在這裏配置.但是我的是在application.properties中配置的.
     */
    private Map<String, Object> getVendorProperties() {
        HibernateSettings hibernateSettings = new HibernateSettings();
        return jpaProperties.getHibernateProperties(hibernateSettings);
    }

    /**
     * 配置EntityManagerFactory實體
     *
     * @param builder
     * @return 實體管理工廠
     * packages     掃描@Entity註釋的軟件包名稱
     * persistenceUnit  持久性單元的名稱。 如果只建立一個EntityManagerFactory,你可以省略這個,但是如果在同一個應用程序中有多個,你應該給它們不同的名字
     * properties       標準JPA或供應商特定配置的通用屬性。 這些屬性覆蓋構造函數中提供的任何值。
     */
    @Primary
    @Bean(name = "entityManagerFactoryMysql")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryMysql(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(mysqlDataSource)
                .properties(getVendorProperties())
                .packages("com.xxx.mysql")
                .persistenceUnit("mysqlPersistenceUnit")
                .build();
    }

    /**
     * 配置EntityManager實體
     *
     * @param builder
     * @return 實體管理器
     */
    @Primary
    @Bean(name = "entityManagerMysql")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryMysql(builder).getObject().createEntityManager();
    }


    /**
     * 配置事務transactionManager
     *
     * @param builder
     * @return 事務管理器
     */
    @Primary
    @Bean(name = "transactionManagerMysql")
    public PlatformTransactionManager transactionManagerMysql(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryMysql(builder).getObject());
    }

}
SqliteDataSourceConfig
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySqlite",   //EntityManagerFactory引用
        transactionManagerRef = "transactionManagerSqlite",      //transactionManager引用
        basePackages = {"com.xxx.sqlite"})
public class SqliteDataSourceConfig {
    /**
     * 註入 sqlite數據源
     */
    @Resource(name = "sqliteDataSource")
    private DataSource sqliteDataSource;

    /**
     * 註入JPA配置實體
     */
    @Autowired
    private JpaProperties jpaProperties;

    /**
     * 這裏其實不需要配置數據庫的方言.
     */
    private Map<String, Object> getVendorProperties() {
        HibernateSettings hibernateSettings = new HibernateSettings();
        return jpaProperties.getHibernateProperties(hibernateSettings);
    }

    /**
     * 配置EntityManagerFactory實體
     *
     * @param builder
     * @return 實體管理工廠
     * packages     掃描@Entity註釋的軟件包名稱
     * persistenceUnit  持久性單元的名稱。 如果只建立一個EntityManagerFactory,你可以省略這個,但是如果在同一個應用程序中有多個,你應該給它們不同的名字
     * properties       標準JPA或供應商特定配置的通用屬性。 這些屬性覆蓋構造函數中提供的任何值。
     */
    @Bean(name = "entityManagerFactorySqlite")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySqlite(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(sqliteDataSource)
                .properties(getVendorProperties())
                .packages("com.xxx.sqlite")
                .persistenceUnit("sqlitePersistenceUnit")
                .build();
    }

    /**
     * 配置EntityManager實體
     *
     * @param builder
     * @return 實體管理器
     */
    @Bean(name = "entityManagerSqlite")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactorySqlite(builder).getObject().createEntityManager();
    }


    /**
     * 配置事務transactionManager
     *
     * @param builder
     * @return 事務管理器
     */
    @Bean(name = "transactionManagerSqlite")
    public PlatformTransactionManager transactionManagerSqlite(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySqlite(builder).getObject());
    }

}

然後com.xxx.mysql和com.xxx.sqlite目錄下就可以放各自的domain和repository了.跟單數據源沒有區別.

參考:

https://www.cnblogs.com/sxdcgaq8080/p/7978205.html (springboot-1.5.9)

https://my.oschina.net/chinesedragon/blog/1647846 (springboot-2.0.0)

springboot2.0.3使用jpa和hibernate的方式配置多數據源(sqlite和mysql)