如何配置多数据源

在 application.properties 中定义两个 DataSource

定义两个 DataSource 用来读取 application.properties 中的不同配置。如下例子中,主数据源配置为 spring.datasource.one 开头的配置,第二数据源配置为 spring.datasource.two 开头的配置。

//这是默认配置,我们做一下对比
spring.datasource.url=db1
spring.datasource.username=db1_username
spring.datasource.password=db1_password
//# Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖
...
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=5
...//#Druid 数据源 1 配置,继承spring.datasource.druid.* 配置,相同则覆盖
//#db1的配置会上面的配置
...
spring.datasource.druid.one.url=db1
spring.datasource.druid.one.username=db1_username
spring.datasource.druid.one.password=db1_password
spring.datasource.druid.one.max-active=10
spring.datasource.druid.one.max-wait=10000
...
//# Druid 数据源 2 配置,继承spring.datasource.druid.* 配置,相同则覆盖
...
spring.datasource.druid.two.url=db2
spring.datasource.druid.two.username=db2_username
spring.datasource.druid.two.password=db2_password
spring.datasource.druid.two.max-active=20
spring.datasource.druid.two.max-wait=20000
...

定义两个 DataSourceConfigJava 类

两个 DataSourceConfig 类内容如下:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryOne",transactionManagerRef="transactionManagerOne",basePackages= { "com.jackzhang.example.one" }) //设置Repository所在位置
@EnableConfigurationProperties(JpaProperties.class)
public class DataSourceOneConfig {/*** 配置数据源1*/@Primary@Bean(name = "dataSourceOne")@ConfigurationProperties("spring.datasource.druid.one")public DataSource dataSourceOne(){return DruidDataSourceBuilder.create().build();}@Autowired@Qualifier("dataSourceOne")private DataSource oneDataSource;@Primary@Bean(name = "entityManagerOne")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryOne(builder).getObject().createEntityManager();}@Primary@Bean(name = "entityManagerFactoryOne")public LocalContainerEntityManagerFactoryBean entityManagerFactoryOne (EntityManagerFactoryBuilder builder) {return builder.dataSource(oneDataSource).properties(getVendorProperties(oneDataSource)).packages("com.jackzhang.example.one") //设置实体类所在位置.persistenceUnit("onePersistenceUnit").build();}@Autowiredprivate JpaProperties jpaProperties;private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}@Primary@Bean(name = "transactionManagerOne")public PlatformTransactionManager transactionManagerOne(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryOne(builder).getObject());}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryTwo",transactionManagerRef="transactionManagerTwo",basePackages= { "com.jackzhang.example.two" }) //设置Repository所在位置
@EnableConfigurationProperties(JpaProperties.class)
public class DataSourceTwoConfig {/*** 配置数据源2*/@Primary@Bean(name = "dataSourceTwo")@ConfigurationProperties("spring.datasource.druid.two")public DataSource dataSourceTwo(){return DruidDataSourceBuilder.create().build();}@Autowired@Qualifier("dataSourceTwo")private DataSource twoDataSource;@Primary@Bean(name = "entityManagerTwo")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryTwo(builder).getObject().createEntityManager();}@Primary@Bean(name = "entityManagerFactoryTwo")public LocalContainerEntityManagerFactoryBean entityManagerFactoryTwo (EntityManagerFactoryBuilder builder) {return builder.dataSource(twoDataSource).properties(getVendorProperties(twoDataSource)).packages("com.jackzhang.example.two") //设置实体类所在位置.persistenceUnit("twoPersistenceUnit").build();}@Autowiredprivate JpaProperties jpaProperties;private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}@Primary@Bean(name = "transactionManagerTwo")public PlatformTransactionManager transactionManagerTwo(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryTwo(builder).getObject());}
}

我们发现 DataSourceTwoConfig、DataSourceOneConfig 内容基本一样,思路就是管理两套 datasource,从而带来了两套 transactionManager,分别在这两个 package 下创建各自的实体和数据访问接口即可。当然了也可以通过 @Transactional(rollbackFor = Exception.class, transactionManager= "transactionManagerOne") 来手动选择哪个数据源。

多数据源的场景

随着微服务的推行,其实很少有多数据源的场景的,作者不建议出现多数据源,当出现的时候就要想想,模块划分的是否合理,是否可以通过服务去解决,但不排除 Job 等。

Spring Data JPA 从入门到精通~如何配置多数据源相关推荐

  1. Spring Data JPA 从入门到精通~@Version处理乐观锁的问题

    @Version 处理乐观锁的问题 @Version 乐观锁介绍 我们在研究 Auditing 的时候,发现了一个有趣的注解 @Version,源码如下: package org.springfram ...

  2. spring data jpa从入门到精通_Spring Data JPA的简单入门

    前言 spring data JPA是spring团队打造的sping生态全家桶的一部分,本身内核使用的是hibernate核心源码,用来作为了解java持久层框架基本构成的样本是再好不过的选择.最近 ...

  3. Spring Data JPA 从入门到精通~Naming命名策略详解及其实践

    Naming 命名策略详解及其实践 用 JPA 离不开 @Entity 实体,我都知道实体里面有字段映射,而字段映射的方法有两种: 显式命名:在映射配置时,设置的数据库表名.列名等,就是进行显式命名, ...

  4. Spring Data JPA 从入门到精通~默认数据源的讲解

    默认数据源 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://1 ...

  5. Spring Data JPA 从入门到精通~Auditing及其事件详解

    Auditing 及其事件详解 Auditing 翻译过来是审计和审核,Spring 的优秀之处在于帮我们想到了很多繁琐事情的解决方案,我们在实际的业务系统中,针对一张表的操作大部分是需要记录谁什么时 ...

  6. Spring Data JPA 从入门到精通~实际工作的应用场景

    在实际工作中,有哪些场景会用到自定义 Repository 呢,这里列出几种实际在工作中的应用案例. 1. 逻辑删除场景 可以用到上面说的两种实现方式,如果有框架级别的全局自定义 Respositor ...

  7. Spring Data JPA 从入门到精通~自定义实现Repository

    EntityManager 的获取方式 我们既然要自定义,首先讲一下 EntityManager 的两种获取方式. 1. 通过 @PersistenceContext 注解. 通过将 @Persist ...

  8. Spring Data JPA 从入门到精通~EntityManager介绍

    EntityManager 介绍 我们前面已经无数次提到了,JPA 的默认 Repository 的实现类是 SimpleJpaRepository,而里面的具体实现就是调用的 EntityManag ...

  9. Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例

    新建两个实体 @Entity(name = "UserInfoEntity") @Table(name = "user_info", schema = &quo ...

最新文章

  1. ERROR 1436 (HY000) at line 1943
  2. flag在java怎么用_JAVA flag怎么用
  3. 汇编--两种过程定义的方式,调用方式。
  4. C#:Dockpanel的一些入门的基本操作
  5. 一名“企业定制化人才”的自诉:“我不愿意,但却无可奈何”
  6. 吹气球问题的C语言编程,C语言怎样给一个数组中的数从大到小排序
  7. javascript基础修炼(1)——一道十面埋伏的原型链面试题
  8. Docker容器数据卷讲解
  9. mac安装xdebug
  10. 树莓派+英特尔神经网络计算棒
  11. vtk中画几何图形存储为vtk文件并在窗口显示
  12. 如何安装虚拟机linux
  13. sudo rm -rf /* 命令运行演示(管理员身份删除根目录所有文件)
  14. 围棋打谱程序之棋盘类(包括提子,子串搜索,打劫,禁手等判断)
  15. 如何高效的使用便利贴 win10便签贴工具居然可以这么好用
  16. 03-旭日X3派测评——Samples案例测试
  17. 人工智能、大数据投身体育赛场 是搅局还是颠覆?
  18. 半年私域流量产值7.3亿,特步私域之路走对了吗?
  19. 【引用】强烈推荐:胡小林学习《弟子规》心得讲座
  20. 程序员,请写健康的代码

热门文章

  1. 美团数据库高可用架构的演进与设想
  2. 量化投资交易 vn.py
  3. 时间约束的实体解析中记录对排序研究
  4. 专享!解读抖音企业蓝V认证的详细流程是怎样的
  5. java代码读取properties配置文件实例
  6. 为Openstack制作CentOS7镜像
  7. 携带cookie进行数据请求
  8. Valid BFS? CodeForces - 1037D(思维 bfs)
  9. 2018.8.2 Juint测试介绍及其命名的规范
  10. 逆向工程-真码保存在系统文件破解QQ游戏对对碰助手