【SpringBoot】Spring data JPA的多数据源实现
创始人
2025-06-01 12:07:29

一、主流的多数据源支持方式

  1. 将数据源对象作为参数,传递到调用方法内部,这种方式增加额外的编码。
  2. 将Repository操作接口分包存放,Spring扫描不同的包,自动注入不同的数据源。这种方式实现简单,也是一种“约定大于配置”思想的典型应用。本文将以这种方式实现JPA的多数据源支持
  3. 使用Spring AOP面向切面编程,然后在持久层接口方法上面加注解,不同的注解使用表示使用不同的数据源。在此暂不做介绍。

二、修改application.yml配置多数据源

spring:datasource:primary:jdbc-url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driversecondary:jdbc-url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverjpa:hibernate:ddl-auto: updatedatabase: mysqlshow-sql: true

三、 两组数据持久化接口及实体类,放到不同的package里面

  1. 将4.6章节中使用到的Article.java及ArticleRepository.java放到club.krislin.bootlaunch.jpa.testdb下面
  2. 然后写另外一套操作接口放到club.krislin.bootlaunch.jpa.testdb2下面,如下:
@Data
@Entity
public class Message {@Id@GeneratedValueprivate Long id;@Column(nullable = false)private String name;@Column(nullable = false)private String content;}
public interface MessageRepository extends JpaRepository {}

四、多数据源支持

数据源DataSource的Bean对象创建并注入Spring上下文,分别对应application.yml里面的两套数据源配置

@Configuration
public class JPADataSourceConfig {@Primary@Bean(name = "primaryDataSource")@Qualifier("primaryDataSource")@ConfigurationProperties(prefix="spring.datasource.primary")    //结合application.yml的配置public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondaryDataSource")@Qualifier("secondaryDataSource")@ConfigurationProperties(prefix="spring.datasource.secondary")   //结合application.yml的配置public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}
}

配置实体扫描以及事务管理,注意看@Primary和带注释的地方

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",transactionManagerRef="transactionManagerPrimary",basePackages= { "club.krislin.bootlaunch.jpa.testdb" }) //设置Repository所在位置
public class JPAPrimaryConfig {@Resource@Qualifier("primaryDataSource")private DataSource primaryDataSource;        //primary数据源注入@Primary@Bean(name = "entityManagerPrimary")        //primary实体管理器public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryPrimary(builder).getObject().createEntityManager();}@Primary@Bean(name = "entityManagerFactoryPrimary")    //primary实体工厂public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {return builder.dataSource(primaryDataSource).properties(getVendorProperties()).packages("club.krislin.bootlaunch.jpa.testdb")     //设置实体类所在位置.persistenceUnit("primaryPersistenceUnit").build();}@Resourceprivate JpaProperties jpaProperties;private Map getVendorProperties() {return jpaProperties.getHibernateProperties(new HibernateSettings());}@Primary@Bean(name = "transactionManagerPrimary")         //primary事务管理器public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());}
}

上面的代码将扫描club.krislin.bootlaunch.jpa.testdb下面的实体对象和Repository,并使用primary数据源。仿造这段代码再写一套club.krislin.bootlaunch.jpa.testdb2的配置使用secondary数据源。代码如下:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary",transactionManagerRef="transactionManagerSecondary",basePackages= { "club.krislin.bootlaunch.jpa.testdb2" }) //设置Repository所在位置
public class JPASecondaryConfig {@Resource@Qualifier("secondaryDataSource")private DataSource secondaryDataSource;@Bean(name = "entityManagerSecondary")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactorySecondary(builder).getObject().createEntityManager();}@Bean(name = "entityManagerFactorySecondary")public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {return builder.dataSource(secondaryDataSource).properties(getVendorProperties()).packages("club.krislin.bootlaunch.jpa.testdb2") //设置实体类所在位置.persistenceUnit("secondaryPersistenceUnit").build();}@Resourceprivate JpaProperties jpaProperties;private Map getVendorProperties() {return jpaProperties.getHibernateProperties(new HibernateSettings());}@Bean(name = "transactionManagerSecondary")PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());}}

五、测试

//先构造一个Article对象article,这个操作针对testdb
articleRepository.save(article);
//在构造一个Message对象message,这个操作针对testdb2
messageRepository.save(message);

如果article数据能正确插入testdbarticle表,message数据能正确的插入testdb2的message表,则JPA的多数据源实现正确。

相关内容

热门资讯

世界上速度最快的10辆汽车-有... 今天给各位分享世界上速度最快的10辆汽车-有驾的知识,其中也会对世界上速度最快的汽车是什么车进行解释...
上海租车公司商务车中巴大巴上海... 本篇文章极速百科给大家谈谈上海租车公司商务车中巴大巴上海汽车租赁,以及上海租中巴车地点对应的知识点,...
什么叫ACGN(什么叫AcEl... 本篇文章极速百科给大家谈谈什么叫ACGN,以及什么叫AcEl类药对应的知识点,希望对各位有所帮助,不...
汽车保养项目更换周期表汽车保养... 今天给各位分享汽车保养项目更换周期表汽车保养周期表一览的知识,其中也会对汽车保养周期是多久进行解释,...
辽r是哪个城市的车牌号?(辽r... 本篇文章极速百科给大家谈谈辽r是哪个城市的车牌号?,以及辽r是哪儿的车牌对应的知识点,希望对各位有所...
九流指的是哪九流(九流霸主) ... 本篇文章极速百科给大家谈谈九流指的是哪九流,以及九流霸主对应的知识点,希望对各位有所帮助,不要忘了收...
PPT造车,资本游戏还是历史使... 今天给各位分享PPT造车,资本游戏还是历史使命?的知识,其中也会对ppt造车有哪些进行解释,如果能碰...
什么是普世价值(什么是普世价值... 本篇文章极速百科给大家谈谈什么是普世价值,以及什么是普世价值?对应的知识点,希望对各位有所帮助,不要...
火麒麟的寓意和象征(火麒麟的寓... 今天给各位分享火麒麟的寓意和象征的知识,其中也会对火麒麟的寓意和象征镇宅吗进行解释,如果能碰巧解决你...
007工作制是什么意思(工作制... 本篇文章极速百科给大家谈谈007工作制是什么意思,以及工作制996 985 007对应的知识点,希望...
奥迪A61.8T提速缓慢(奥迪... 本篇文章极速百科给大家谈谈奥迪A61.8T提速缓慢,以及奥迪a628提速慢是怎么回事对应的知识点,希...
为什么我电脑12306登不上去... 为什么我电脑12306登不上去目录为什么我电脑12306登不上去12306登不上去是怎么回事电脑无法...
雷克萨斯rx200t售价多少(... 本篇文章极速百科给大家谈谈雷克萨斯rx200t售价多少,以及rx200雷克萨斯报价表对应的知识点,希...
身字旁的字有哪些,汉字中含有 ... 身字旁的字有哪些目录身字旁的字有哪些
一斤多少克呢(一斤多少克呢怎么... 本篇文章极速百科给大家谈谈一斤多少克呢,以及一斤多少克呢怎么算对应的知识点,希望对各位有所帮助,不要...
秋天的白云像什么,秋天的白云怎... 秋天的白云像什么目录秋天的白云像什么秋天的白云怎么描写白云像什么秋天的白云像什么秋天的白云像什么 ...
知了是如何养殖的 极速百科网 ... 知了是如何养殖的目录知了是如何养殖的知了是如何养殖的关于知了猴养殖技术?知了如何养殖知了是如何养殖的...
29号上高速收费吗(29号上高... 今天给各位分享29号上高速收费吗的知识,其中也会对29号上高速收费吗?进行解释,如果能碰巧解决你现在...
四川有什么风景名胜,四川名胜景... 四川有什么风景名胜目录四川必去的十大景点有哪些名字,四川必去的旅游景点排名四川名胜景点有哪些四川旅游...
好一点的三本大学有哪些,推荐几... 好一点的三本大学有哪些目录好一点的三本大学有哪些推荐几个好三本三本都有哪些好一点的学校全国有哪些三本...
含雨的歇后语,有雨字的歇后语6... 含雨的歇后语目录含雨的歇后语有雨字的歇后语68句带“雨”字的俗语关于雨的歇后语有哪些?含雨的歇后语 ...
一个人一个月大概用多少电,一个... 一个人一个月大概用多少电目录一个人一个月大概用多少电一个月用多少电?一个月的水电费大概多少一个月用多...
王者荣耀nova战队是哪国的,... 王者荣耀nova战队是哪国的目录王者荣耀nova战队是哪国的nova是哪个战队王者荣耀noya是哪个...
大于小于的符号是怎么分清楚的,... 大于小于的符号是怎么分清楚的目录大于小于的符号是怎么分清楚的大与小的符号怎么区分
收入可观是什么意思,钱财有极可... 收入可观是什么意思目录收入可观是什么意思钱财有极可观的收入是什么意思?收入不菲的意思是什么收入可观是...
钢珠是啥(钢珠是啥男) 钢珠是... 今天给各位分享钢珠是啥的知识,其中也会对钢珠是啥男进行解释,如果能碰巧解决你现在面临的问题,别忘了关...
ic芯片查询软件(7大查询网站... 今天给各位分享ic芯片查询软件(7大查询网站)的知识,其中也会对ic芯片查询网址进行解释,如果能碰巧...
油封的安装(油封的安装方向) ... 今天给各位分享油封的安装的知识,其中也会对油封的安装方向进行解释,如果能碰巧解决你现在面临的问题,别...
自然堂和珀莱雅那个效果最好,自... 自然堂和珀莱雅那个效果最好目录自然堂和珀莱雅那个效果最好自然堂和柏莱雅哪个好?两者的区别在哪里?自然...
胭脂是什么意思,胭脂 [yān... 胭脂是什么意思目录胭脂是什么意思胭脂 [yān zhi]什么意思?近义词和反义词是什么?英文翻译是什...