1. 程式人生 > >Spring Boot多資料來源配置(一)durid、mysql、jpa整合

Spring Boot多資料來源配置(一)durid、mysql、jpa整合

目前在做一個統計專案。需要多資料來源整合,其中包括mysql和mongo。本節先講mysql、durid、jpa與spring-boot的整合。

引入Durid包

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.29</version>
</dependency>

配置檔案

spring:
  #mysql配置
  datasource:
    user:
      url: jdbc:mysql://192.168
.1.252/kxlist_user?characterEncoding=utf-8&useSSL=false username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver product: url: jdbc:mysql://192.168.1.252/kxlist_product?characterEncoding=utf-8&useSSL=false username: root password: 123456 driver-class-name: com
.mysql.jdbc.Driver #jpa配置 jpa: database: mysql database-platform: org.hibernate.dialect.MySQL5Dialect show-sql: true hibernate: ddl-auto: update

JAVA檔案

  • 總的配置:
    通過@Primary表示主資料來源。
@Configuration
public class DruidDataSourceConfig {
    @Bean(name="userDataSource")
    @Primary
@ConfigurationProperties(prefix="spring.datasource.user") public DataSource primaryDataSource() { System.out.println("-------------------- userDataSource init ---------------------"); return new DruidDataSource(); } @Bean(name="productDataSource") @ConfigurationProperties(prefix="spring.datasource.product") public DataSource secondaryDataSource() { System.out.println("-------------------- productDataSource init ---------------------"); return new DruidDataSource(); } }
  • user資料來源的配置:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="userEntityManagerFactory",
        transactionManagerRef="userTransactionManager",
        basePackages= { "com.kxlist.statistics.domain.user" }) //設定Repository所在位置
public class UserDataSourceConfig {

    @Autowired
    private JpaProperties jpaProperties;


    @Autowired
    @Qualifier("userDataSource")
    private DataSource userDataSource;
    /**
     * 我們通過LocalContainerEntityManagerFactoryBean來獲取EntityManagerFactory例項
     * @return
     */
    @Bean(name = "userEntityManagerFactoryBean")
    //@Primary
    public LocalContainerEntityManagerFactoryBean userEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(userDataSource)
                .properties(getVendorProperties(userDataSource))
                .packages("com.kxlist.statistics.domain.user") //設定實體類所在位置
                .persistenceUnit("userPersistenceUnit")
                .build();
        //.getObject();//不要在這裡直接獲取EntityManagerFactory
    }

    private Map<String, String> getVendorProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }
    /**
     * EntityManagerFactory類似於Hibernate的SessionFactory,mybatis的SqlSessionFactory
     * 總之,在執行操作之前,我們總要獲取一個EntityManager,這就類似於Hibernate的Session,
     * mybatis的sqlSession.
     * @param builder
     * @return
     */
    @Bean(name = "userEntityManagerFactory")
    @Primary
    public EntityManagerFactory userEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return this.userEntityManagerFactoryBean(builder).getObject();
    }

    /**
     * 配置事物管理器
     * @return
     */
    @Bean(name = "userTransactionManager")
    @Primary
    public PlatformTransactionManager writeTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(userEntityManagerFactory(builder));
    }
}

注意:LocalContainerEntityManagerFactoryBeanuserEntityManagerFactory方法其中一個註解@Primary即可,不然啟動會報錯。

  • product資料來源的配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="productEntityManagerFactory",
        transactionManagerRef="productTransactionManager",
        basePackages= { "com.kxlist.statistics.domain.product" }) //設定Repository所在位置
public class ProductDataSourceConfig {

    @Autowired
    private JpaProperties jpaProperties;


    @Autowired
    @Qualifier("productDataSource")
    private DataSource productDataSource;
    /**
     * 我們通過LocalContainerEntityManagerFactoryBean來獲取EntityManagerFactory例項
     * @return
     */
    @Bean(name = "productEntityManagerFactoryBean")
    public LocalContainerEntityManagerFactoryBean productEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(productDataSource)
                .properties(getVendorProperties(productDataSource))
                .packages("com.kxlist.statistics.domain.product") //設定實體類所在位置
                .persistenceUnit("productPersistenceUnit")
                .build();
        //.getObject();//不要在這裡直接獲取EntityManagerFactory
    }

    private Map<String, String> getVendorProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }
    /**
     * EntityManagerFactory類似於Hibernate的SessionFactory,mybatis的SqlSessionFactory
     * 總之,在執行操作之前,我們總要獲取一個EntityManager,這就類似於Hibernate的Session,
     * mybatis的sqlSession.
     * @param builder
     * @return
     */
    @Bean(name = "productEntityManagerFactory")
    public EntityManagerFactory productEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return this.productEntityManagerFactoryBean(builder).getObject();
    }

    /**
     * 配置事物管理器
     * @return
     */
    @Bean(name = "productTransactionManager")
    public PlatformTransactionManager writeTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(productEntityManagerFactory(builder));
    }
}    

依照程式碼在相對應的包下建實體類和Repository即可。

目錄結構圖

至此,spring-boot與mysql多資料來源的整合已經結束。

參考文章

首發地址