相较于单数据源,双数据源配置有时候在数据分库的时候可能更加有利

但是在参考诸多博客以及书籍(汪云飞的实战书)的时候,发现对于spring boot1.X是完全没问题的,一旦切换到spring boot2.X的时候,就会报出无法实例化出数据源对象等各种问题。我猜测这是无法很好的读取到数据源配置信息的关系。

目前来说,官方文档示例比较好的解决了这个问题

配置双数据源

这里使用java配置方式,需要注意以下几点:

  • 主数据源要加上@Primary注解
  • 需要通过构建DataSourceProperties这个Bean来构建一个数据源,这也是官方文档的示例配置方式,如果采用1.X的方式,很可能会报出jdbcUrl is required with driverClassName这个错误,之后的DataSourceBean,EntityFactoryBean等都会无法实例化
  1. @Configuration
  2. public class DataSourceConfig {
  3. @Bean
  4. @Primary
  5. @ConfigurationProperties("app.datasource.primary")
  6. public DataSourceProperties firstDataSourceProperties() {
  7. return new DataSourceProperties();
  8. }
  9. @Bean(name = "primaryDataSource")
  10. @Primary
  11. @ConfigurationProperties("app.datasource.primary")
  12. public DataSource primaryDataSource() {
  13. return firstDataSourceProperties().initializeDataSourceBuilder().build();
  14. }
  15. @Bean
  16. @ConfigurationProperties("app.datasource.secondary")
  17. public DataSourceProperties secondDataSourceProperties() {
  18. return new DataSourceProperties();
  19. }
  20. @Bean(name = "secondaryDataSource")
  21. @ConfigurationProperties("app.datasource.secondary")
  22. public DataSource secondaryDataSource() {
  23. return secondDataSourceProperties().initializeDataSourceBuilder().build();
  24. }
  25. }

配置yml文件

就是在application.yml文件里写一些数据库的配置信息,这个应该都比较轻车熟路了。关于是使用propertiesyml方式,看个人习惯

  1. spring:
  2. jpa:
  3. show-sql: true
  4. hibernate:
  5. ddl-auto: update
  6. app:
  7. datasource:
  8. primary:
  9. url: jdbc:mysql://localhost:3306/kpimanage
  10. username: root
  11. password: root123
  12. maximum-pool-size: 30
  13. driver-class-name: com.mysql.jdbc.Driver
  14. secondary:
  15. url: jdbc:mysql://localhost:3306/local
  16. username: root
  17. password: root123
  18. maximum-pool-size: 30
  19. driver-class-name: com.mysql.jdbc.Driver

配置Spring Jpa

主要是以下几点:

  • 启动事务管理
  • 定义entity包。也可以不定义,使用默认扫描的方式
  • 定义repository包。也可以不定义,使用默认扫描的方式
  • 自定义EntiryManagerFactoryBean
  • 注意这里只是对使用spring data jpa来说有用,如果使用mybatis的话,根据自身情况配置,这里的配置完全不适用
  1. @Configuration
  2. @EnableTransactionManagement//开启事务管理
  3. @EnableJpaRepositories(basePackages = "com.luzj.dblsource.repository.primary",
  4. entityManagerFactoryRef = "entityManagerFactoryPrimary",
  5. transactionManagerRef = "transactionManagerPrimary")//jpa 配置>repository位置,实体管理Factory配置,事务管理配置
  6. public class PrimaryConfig {
  7. @Autowired @Qualifier("primaryDataSource")
  8. DataSource primaryDataSource;
  9. // 自定义EntityManagerFactory
  10. @Primary
  11. @Bean(name = "entityManagerFactoryPrimary")
  12. public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
  13. return builder
  14. .dataSource(primaryDataSource)
  15. .packages("com.luzj.dblsource.entity.primary") //设置实体类所在位置
  16. .persistenceUnit("primaryPersistenceUnit")
  17. .build();
  18. }
  19. //自定义EntityManager
  20. @Primary
  21. @Bean(name = "entityManagerPrimary")
  22. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  23. return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
  24. }
  25. //自定义TransactionManager
  26. @Primary
  27. @Bean(name = "transactionManagerPrimary")
  28. public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
  29. JpaTransactionManager transactionManager = new JpaTransactionManager();
  30. transactionManager.setEntityManagerFactory(entityManagerFactoryPrimary(builder).getObject());
  31. return transactionManager;
  32. }
  33. }

同时,第二数据源也如此配置

  1. @Configuration
  2. @EnableTransactionManagement
  3. @EnableJpaRepositories(basePackages = "com.luzj.dblsource.repository.secondary",
  4. entityManagerFactoryRef = "entityManagerFactorySecondary",
  5. transactionManagerRef = "transactionManagerSecondary")
  6. public class SecondaryConfig {
  7. //...
  8. }

测试

配置基本到此结束,下面分别在两个数据库建立不同的table,然后使用repository对表进行操作,看是否能够顺利运行

primary数据库建立Person表以及repository

  1. @Entity
  2. public class Person {
  3. @Id
  4. @GeneratedValue
  5. private Integer id;
  6. private String address;
  7. private Integer age;
  8. private String name;
  9. //setter getter...
  10. }
  1. public interface PersonRepository extends JpaRepository<Person,Integer> {
  2. }

secondary数据库建立code_river表

  1. @Entity
  2. @Table(name = "code_river")
  3. public class CodeRiver {
  4. @Id
  5. @Column(name = "river_id")
  6. private String id;
  7. @Column(name = "river_desc")
  8. private String riverDesc;
  9. //setter getter ...
  10. }
  1. public interface CodeRiverRepository extends JpaRepository<CodeRiver,String> {
  2. }

单元测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class DblsourceApplicationTests {
  4. @Test
  5. public void contextLoads() {
  6. }
  7. @Autowired
  8. private PersonRepository personRepository;
  9. @Autowired
  10. private CodeRiverRepository codeRiverRepository;
  11. @Test
  12. public void test(){
  13. personRepository.save(new Person("湖南",23,"章邯"));
  14. personRepository.save(new Person("纽约",27,"john"));
  15. personRepository.save(new Person("香港",43,"张一山"));
  16. personRepository.save(new Person("北京",44,"张朝阳"));
  17. personRepository.save(new Person("深圳",53,"马化腾"));
  18. Assert.assertEquals(5,personRepository.findAll().size());
  19. codeRiverRepository.save(new CodeRiver("area110","阿姆斯特朗回旋加速过海"));
  20. Assert.assertEquals(1,codeRiverRepository.findAll().size());
  21. }
  22. }

小结

主要介绍了在springboot 2.4环境下多数据源的配置方式

代码地址

参考

Spring Boot2.4双数据源的配置的更多相关文章

  1. Spring Boot2.x 动态数据源配置

    原文链接: Spring Boot2.x 动态数据源配置 基于 Spring Boot 2.x.Spring Data JPA.druid.mysql 的动态数据源配置Demo,适合用于数据库的读写分 ...

  2. Springboot spring data jpa 多数据源的配置01

    Springboot spring data jpa 多数据源的配置 (说明:这只是引入了多个数据源,他们各自管理各自的事务,并没有实现统一的事务控制) 例: user数据库   global 数据库 ...

  3. spring与mysql整合数据源的配置

    需要解决两点,数据源的配置交给spring完成,事务管理交个spring来管理. <context:property-placeholder location="classpath:c ...

  4. 【spring cloud】spring cloud2.X spring boot2.0.4调用feign配置Hystrix Dashboard 和 集成Turbine 【解决:Hystrix仪表盘Unable to connect to Command Metric Stream】【解决:Hystrix仪表盘Loading...】

    环境: <java.version>1.8</java.version><spring-boot.version>2.0.4.RELEASE</spring- ...

  5. Spring Boot2.0+中,自定义配置类扩展springMVC的功能

    在spring boot1.0+,我们可以使用WebMvcConfigurerAdapter来扩展springMVC的功能,其中自定义的拦截器并不会拦截静态资源(js.css等). @Configur ...

  6. Spring Boot,Spring Data JPA多数据源支持配置

    1 配置文件 wisely.primary.datasource.driverClassName=oracle.jdbc.OracleDriver wisely.primary.datasource. ...

  7. Spring全家桶--单数据源的配置

    前言 spring数据源的配置网络上有很多例子,这里我也来介绍一下单数据源配置的例子,基于SpringBoot的方式和原生的Spring的方式. 一.生成项目骨架(SpringBoot),运行一个简单 ...

  8. Spring Boot2.0之多环境配置

    本地开发环境 测试环境 实际项目中 区分不同的环境配置文件信息 首先创建三种不同场景下的配置文件: 内容分别是: ###dev http_url="dev" ###prdhttp_ ...

  9. Spring Boot2.2.X中Tomcat配置 错误定制

    1: Tomcat定制 EmbeddedServletContainerCustomizer 已久废弃 按照下面的方式来处理 通过的类的配置 @Component public class Tomca ...

随机推荐

  1. 从零开始的全栈工程师——PHP篇 ( 单词汇总 ) ( php解决文字乱码 )

    解决乱码: header("Content-Type: text/html;charset=utf-8"); 单词 局部的: local 全局的: global 静态的: stat ...

  2. centOs升级

    因为军佬放弃制作Centos7的网络重装包,又Centos7的安装引导和6有较大区别所以,选择曲线救国(技术不行,只能这样乱搞)前文:Centos6.9一键重装包https://ppx.ink/net ...

  3. js数组的sort排序的原理和应用

    1.js sort()方法的应用: 首先:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串( ...

  4. Android FlycoDialog 简单实用的自定义Android弹窗对话框之Dialog篇

    效果图镇楼   FlycoDialog是一款非常棒的弹窗对话框处理框架,今天在这里主要讲一下他的自定义弹出对话框的功能,这里以第二幅效果图为例,图片已经放在博客最下方,X号自己随便找一个东西代替吧.  ...

  5. check_mk的性能案例

    http://wiki.lustre.org/Check_MK/Graphite/Graphios_Setup_Guide Dell PowerEdge R515 2x 8-Core AMD Opte ...

  6. February 25 2017 Week 8 Saturday

    Energy and persistence can conquer all things. 能量和毅力可以征服一切. I have the persistence, but it seems I a ...

  7. PHP Swoole 基于纯真IP库根据IP匹配城市

    把纯真IP库读到内存,纯真IP库本来就是有序的,然后每次请求二分查找就行,44WIP查找十几次就搞定了 dispatch_mode最好写3,不然做服务的时候,会导致进程任务分配不均匀. max_req ...

  8. C语言 Include指令(引用头文件)

    #include "one.h" #include "two.h" int main(int argc, const char * argv[]) { one( ...

  9. c++互斥锁的实现

    class IMyLock { public: virtual ~IMyLock(){} ; ; }; class Mutex : public IMyLock { public: Mutex(); ...

  10. 20165322 学习基础及C语言基础调查

    学习基础和C语言基础调查 一.技能学习经验 有什么技能比90%的人更好? 说来惭愧,我并不认为自己有什么技能能超过90%的人.我从小喜爱水彩画和推理解谜,在自己一些闲余时间的练习与学习下,应该可以超过 ...