设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

查看: 655|回复: 0

Spring Boot配置和使用两个数据源的实现步骤

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:9
  • 最近打卡:2025-08-31 16:33:34
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
35
主题
29
精华
0
金钱
113
积分
66
注册时间
2023-9-29
最后登录
2025-8-31

发表于 2025-8-28 05:06:11 | 显示全部楼层 |阅读模式

Spring Boot配置和使用两个数据源

技术背景

在实际的开发场景中,一个Spring Boot应用可能需要连接多个数据库,比如主从数据库、不同业务模块使用不同数据库等。Spring Boot本身支持多数据源的配置,通过合理配置可以实现对多个数据源的管理和使用。

实现步骤

1. 配置数据源信息

  1. application.properties
复制代码
  1. application.yml
复制代码
中添加两个数据源的配置信息。以
  1. application.properties
复制代码
为例:

  1. # 第一个数据库配置
  2. spring.datasource.url = [url]
  3. spring.datasource.username = [username]
  4. spring.datasource.password = [password]
  5. spring.datasource.driverClassName = oracle.jdbc.OracleDriver
  6. # 第二个数据库配置
  7. spring.secondDatasource.url = [url]
  8. spring.secondDatasource.username = [username]
  9. spring.secondDatasource.password = [password]
  10. spring.secondDatasource.driverClassName = oracle.jdbc.OracleDriver
复制代码

2. 创建数据源Bean

在配置类中创建两个数据源的Bean:

  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. import org.springframework.boot.jdbc.DataSourceBuilder;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import javax.sql.DataSource;
  6. @Configuration
  7. public class DataSourceConfig {
  8. @Bean
  9. @Primary
  10. @ConfigurationProperties(prefix="spring.datasource")
  11. public DataSource primaryDataSource() {
  12. return DataSourceBuilder.create().build();
  13. }
  14. @Bean
  15. @ConfigurationProperties(prefix="spring.secondDatasource")
  16. public DataSource secondaryDataSource() {
  17. return DataSourceBuilder.create().build();
  18. }
  19. }
复制代码

3. 配置事务管理器(可选)

如果需要对两个数据源进行事务管理,可以配置两个事务管理器:

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  4. import javax.sql.DataSource;
  5. @Configuration
  6. public class TransactionManagerConfig {
  7. @Bean(name="tm1")
  8. @Autowired
  9. @Primary
  10. DataSourceTransactionManager tm1(@Qualifier ("primaryDataSource") DataSource datasource) {
  11. DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
  12. return txm;
  13. }
  14. @Bean(name="tm2")
  15. @Autowired
  16. DataSourceTransactionManager tm2(@Qualifier ("secondaryDataSource") DataSource datasource) {
  17. DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
  18. return txm;
  19. }
  20. }
复制代码

4. 使用不同的数据源

在需要使用数据源的地方,通过

  1. @Qualifier
复制代码
注解指定使用哪个数据源:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.beans.factory.annotation.Qualifier;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import org.springframework.stereotype.Service;
  5. import javax.sql.DataSource;
  6. @Service
  7. public class MyService {
  8. private final JdbcTemplate primaryJdbcTemplate;
  9. private final JdbcTemplate secondaryJdbcTemplate;
  10. @Autowired
  11. public MyService(@Qualifier("primaryDataSource") DataSource primaryDataSource,
  12. @Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
  13. this.primaryJdbcTemplate = new JdbcTemplate(primaryDataSource);
  14. this.secondaryJdbcTemplate = new JdbcTemplate(secondaryDataSource);
  15. }
  16. public void doSomething() {
  17. // 使用主数据源执行操作
  18. primaryJdbcTemplate.execute("SELECT 1 FROM DUAL");
  19. // 使用从数据源执行操作
  20. secondaryJdbcTemplate.execute("SELECT 1 FROM DUAL");
  21. }
  22. }
复制代码

核心代码

数据源配置

  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. import org.springframework.boot.jdbc.DataSourceBuilder;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import javax.sql.DataSource;
  6. @Configuration
  7. public class DataSourceConfig {
  8. @Bean
  9. @Primary
  10. @ConfigurationProperties(prefix="spring.datasource")
  11. public DataSource primaryDataSource() {
  12. return DataSourceBuilder.create().build();
  13. }
  14. @Bean
  15. @ConfigurationProperties(prefix="spring.secondDatasource")
  16. public DataSource secondaryDataSource() {
  17. return DataSourceBuilder.create().build();
  18. }
  19. }
复制代码

事务管理器配置

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  4. import javax.sql.DataSource;
  5. @Configuration
  6. public class TransactionManagerConfig {
  7. @Bean(name="tm1")
  8. @Autowired
  9. @Primary
  10. DataSourceTransactionManager tm1(@Qualifier ("primaryDataSource") DataSource datasource) {
  11. DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
  12. return txm;
  13. }
  14. @Bean(name="tm2")
  15. @Autowired
  16. DataSourceTransactionManager tm2(@Qualifier ("secondaryDataSource") DataSource datasource) {
  17. DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
  18. return txm;
  19. }
  20. }
复制代码

服务层使用数据源

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.beans.factory.annotation.Qualifier;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import org.springframework.stereotype.Service;
  5. import javax.sql.DataSource;
  6. @Service
  7. public class MyService {
  8. private final JdbcTemplate primaryJdbcTemplate;
  9. private final JdbcTemplate secondaryJdbcTemplate;
  10. @Autowired
  11. public MyService(@Qualifier("primaryDataSource") DataSource primaryDataSource,
  12. @Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
  13. this.primaryJdbcTemplate = new JdbcTemplate(primaryDataSource);
  14. this.secondaryJdbcTemplate = new JdbcTemplate(secondaryDataSource);
  15. }
  16. public void doSomething() {
  17. // 使用主数据源执行操作
  18. primaryJdbcTemplate.execute("SELECT 1 FROM DUAL");
  19. // 使用从数据源执行操作
  20. secondaryJdbcTemplate.execute("SELECT 1 FROM DUAL");
  21. }
  22. }
复制代码

最佳实践

  • 标记主数据源:使用
    1. @Primary
    复制代码
    注解标记一个主数据源,这样在自动注入时Spring会优先使用该数据源。
  • 事务管理:对于需要同时操作两个数据源的场景,使用
    1. ChainedTransactionManager
    复制代码
    进行事务管理。
  • 代码隔离:将不同数据源的配置和使用代码进行隔离,提高代码的可维护性。

常见问题

1.jdbcUrl is required with driverClassName错误

在Spring Boot 2.0之后,需要使用

  1. jdbc-url
复制代码
代替
  1. url
复制代码

2. 如何让不同的JpaRepository使用不同的数据源

可以通过配置不同的

  1. EntityManagerFactory
复制代码
  1. TransactionManager
复制代码
,并在
  1. @EnableJpaRepositories
复制代码
注解中指定对应的
  1. entityManagerFactoryRef
复制代码
  1. transactionManagerRef
复制代码

3. 分布式事务问题

如果需要在两个数据源之间进行分布式事务处理,可以考虑使用XA协议或分布式事务框架,如Atomikos。

到此这篇关于Spring Boot配置和使用两个数据源的实现步骤的文章就介绍到这了,更多相关Spring Boot内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表