当前位置:   article > 正文

Spring Boot + Spring Data JPA项目配置多数据源_jpa 多数据源配置 连接池用同一个

jpa 多数据源配置 连接池用同一个

原文出自:http://blog.csdn.net/anxpp/article/details/52274120,转载请注明出处,谢谢!


    在以前的常规项目中,直接XML配置文件中配置多个数据源即可,在最新推荐的做法中,我们使用配置类来设置。

首先配置两个数据源:

  1. package com.anxpp.web.config;
  2. import javax.sql.DataSource;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
  5. import org.springframework.boot.context.properties.ConfigurationProperties;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.context.annotation.Primary;
  9. @Configuration
  10. public class DataSourceConfig {
  11. @Bean(name = "primaryDS")
  12. @Qualifier("primaryDS")
  13. @Primary
  14. @ConfigurationProperties(prefix="spring.primary.datasource")
  15. public DataSource primaryDataSource(){
  16. return DataSourceBuilder.create().build();
  17. }
  18. @Bean(name = "secondaryDS")
  19. @Qualifier("secondaryDS")
  20. @ConfigurationProperties(prefix="spring.secondary.datasource")
  21. public DataSource secondaryDataSource(){
  22. return DataSourceBuilder.create().build();
  23. }
  24. }

    @Primary 的意思是默认实现。

然后分别配置两个数据源的详细信息。

    配置一:

  1. package com.anxpp.web.config;
  2. import java.util.Map;
  3. import javax.persistence.EntityManager;
  4. import javax.sql.DataSource;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  8. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.context.annotation.Primary;
  12. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  13. import org.springframework.orm.jpa.JpaTransactionManager;
  14. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  15. import org.springframework.transaction.PlatformTransactionManager;
  16. import org.springframework.transaction.annotation.EnableTransactionManagement;
  17. /**
  18. * 开发环境数据库数据源配置
  19. * @author
  20. *
  21. */
  22. @Configuration
  23. @EnableTransactionManagement
  24. @EnableJpaRepositories(
  25. entityManagerFactoryRef="entityManagerFactoryPrimary",
  26. transactionManagerRef="transactionManagerPrimary",
  27. basePackages= { "com.anxpp.web.core.repo.work" })//设置dao(repo)所在位置
  28. public class RepositoryPrimaryConfig {
  29. @Autowired
  30. private JpaProperties jpaProperties;
  31. @Autowired
  32. @Qualifier("primaryDS")
  33. private DataSource primaryDS;
  34. @Bean(name = "entityManagerPrimary")
  35. @Primary
  36. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  37. return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
  38. }
  39. @Bean(name = "entityManagerFactoryPrimary")
  40. @Primary
  41. public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
  42. return builder
  43. .dataSource(primaryDS)
  44. .properties(getVendorProperties(primaryDS))
  45. .packages("com.anxpp.web.core.entity.po") //设置实体类所在位置
  46. .persistenceUnit("primaryPersistenceUnit")
  47. .build();
  48. }
  49. private Map<String, String> getVendorProperties(DataSource dataSource) {
  50. return jpaProperties.getHibernateProperties(dataSource);
  51. }
  52. @Bean(name = "transactionManagerPrimary")
  53. @Primary
  54. PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
  55. return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
  56. }
  57. }
    配置二:
  1. package com.anxpp.web.config;
  2. import java.util.Map;
  3. import javax.persistence.EntityManager;
  4. import javax.sql.DataSource;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  8. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  12. import org.springframework.orm.jpa.JpaTransactionManager;
  13. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  14. import org.springframework.transaction.PlatformTransactionManager;
  15. import org.springframework.transaction.annotation.EnableTransactionManagement;
  16. @Configuration
  17. @EnableTransactionManagement
  18. @EnableJpaRepositories(
  19. entityManagerFactoryRef="entityManagerFactorySecondary",
  20. transactionManagerRef="transactionManagerSecondary",
  21. basePackages= { "com.anxpp.web.core.repo.dev" })
  22. public class RepositorySecondaryConfig {
  23. @Autowired
  24. private JpaProperties jpaProperties;
  25. @Autowired @Qualifier("secondaryDS")
  26. private DataSource secondaryDS;
  27. @Bean(name = "entityManagerSecondary")
  28. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  29. return entityManagerFactorySecondary(builder).getObject().createEntityManager();
  30. }
  31. @Bean(name = "entityManagerFactorySecondary")
  32. public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
  33. return builder
  34. .dataSource(secondaryDS)
  35. .properties(getVendorProperties(secondaryDS))
  36. .packages("com.anxpp.web.core.entity.po")
  37. .persistenceUnit("secondaryPersistenceUnit")
  38. .build();
  39. }
  40. private Map<String, String> getVendorProperties(DataSource dataSource) {
  41. return jpaProperties.getHibernateProperties(dataSource);
  42. }
  43. @Bean(name = "transactionManagerSecondary")
  44. PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
  45. return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
  46. }
  47. }
    上文中 com.anxpp.web.core.repo.dev 表示数据访问接口的包,其中的repo访问数据库时,会自动使用RepositorySecondaryConfig。

    实体也类似。

数据库连接配置:

#Work
spring.primary.datasource.url=jdbc:oracle:thin:@//ip:port/dbname
spring.primary.datasource.username=username
spring.primary.datasource.password=password
spring.primary.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#Development
spring.secondary.datasource.url=jdbc:oracle:thin:@//ip:port/dbname
spring.secondary.datasource.username=username
spring.secondary.datasource.password=username
spring.secondary.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#multiple Setting
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
    然后就可以直接使用了。


配置完成

    当然,也可以配置更多数据源。

    本人需要这种需求是因为两个数据库,需要一些细粒度的数据对比同步,在Java代码中更容易操作,所以就使用两个数据源的Java代码来完成了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/52324
推荐阅读
相关标签
  

闽ICP备14008679号