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多數據源的整合已經結束。

參考文章

https://my.oschina.net/lengchuan/blog/882391

首發地址

http://www.devzxd.top/2017/06/06/springboot-datasource-mysql.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM