Spring Boot多数据源

Spring Boot多数据源

前面一篇文章Spring Boot多数据源结合自己实际工作经验给大家分享一种简单灵活的SpringBoot多数据源动态切换方案,特点如下:

  • 双重数据源初始化方式:支持配置文件和数据库配置表两种。
  • 多种数据源切换方式:支持按AOP注解、用户身份、数据源名称三种方式切换。
  • 统一事务管控机制:统一封装了事务访问service,事务统一通过@Transactional(rollbackFor = Exception.class)控制(单个数据源访问情况下使用)。
  • 灵活实用:相较于常见实现方案,本方案更加灵活和实用 。

该方案存在如下两点不足或需要完善的地方:

切换数据库连接池不灵活: 初始化的默认多数据源数据源对象是HikariDataSource,如果想用其他数据源需要新加实现。

不支持分布式事务: 只能同时在一个数据源下面执行事务操作,不支持跨数据库事务功能。

下面介绍调整后的数据库连接初始化功能和分布式事务(JTA)功能。

一、数据库连接初始化功能

数据源对象参考网上常用方式继承AbstractRoutingDataSource实现,并通过初始化配置类DynamicDataSourceAndTemplateConfig初始化默认数据源和其他数据源到AbstractRoutingDataSource实现类。

1、数据源对象实现示例如下:

java 复制代码
public class DynamicDataSourceRouter extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceKeyHolder.getKey();
    }
}

2、数据源初始化配置类示例如下:

二、添加分布式事务功能

要在多数据源(支持分布式事务的数据库数据源)里实现多个数据库操作事务支持,即分布式事务,主要通过框架里面的JTA实现,统一使用注解@Transactional(rollbackFor = Exception.class)控制事务。主要通过调整配置文件、增加初始化配置类、封装事务查询接口实现。

1、配置文件添加jta,示例如下:

maven配置:

application.yml添加jta开关和参数:

2、增加初始化配置类,示例如下:

3、封装事务查询接口,示例如下:

三、测试

主要在Controller中添加事务测试方法,示例如下:

添加好测试方法后,访问如下接口测试事务:

http://localhost:8080/test/base/testTransaction

测试结果:

  1. 如果开启jta,并且模拟异常下面一行代码注释,可以在derby表里成功添加数据,访问一次增加一条。
  2. 如果未开启jta,模拟异常下面一行代码注释,不可以在derby表里成功添加数据。
  3. 如果开启jta,并且模拟异常下面一行代码未注释,derby表里添加数据失败,返回三条数据。

四、总结

本文分享了一种灵活的同时支持两种多数据源初始化方式、三种多数据源切换方式、多数据源分布式事务控制的SpringBoot多数据源功能实现方案,能满足大部分使用场景。希望对你有所帮助,有疑问欢迎留言交流。

相关推荐
i220818 Faiz Ul1 小时前
在线预约导游|基于SSM+vue的在线预约导游系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·在线预约导游系统
云登指纹浏览器1 小时前
指纹浏览器自动化API对接实战总结:技术方案选型 + 避坑指南
运维·后端·自动化
绝知此事1 小时前
ELK 从入门到精通:Spring Boot 实战三部曲(二)—— 进阶特性与性能优化
spring boot·elk·性能优化
绝知此事1 小时前
ELK 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手
spring boot·后端·elk
土狗TuGou1 小时前
SQL内功笔记 · 第5篇:SQL逻辑执行顺序
数据库·笔记·后端·sql·mysql
右耳朵猫AI1 小时前
Java & JVM技术周刊 2026年第19周
java·开发语言·jvm
1candobetter2 小时前
单接口性能测试实践总结:压测方案设计、成功判定与 JVM 监控分析
java·jvm·压力测试·测试
han_hanker2 小时前
Java 对象序列化
java·开发语言
四代水门2 小时前
服务端倒带(Server-Side Rewind)命中判定系统
java·前端·算法