最近做了一个自动支持多数据源配置的功能,基于springboot生态扩展,可自动识别配置文件中的数据库配置参数,并进行autoconfig。
multiple-datasource多数据源支持模块
功能性
- 支持自动化配置多个数据源;
- 支持自动化配置持久层框架(mybatis);
- 支持自动化配置分布式事务管理器(JTA-Atomikos);
- 支持不同数据源使用不同数据库;
- 支持不同数据源使用不同数据库且使用不同连接池(hikari、dbcp2、tomcat-pool、druid等);
- 支持自动适配不同数据库分页特性,自动分页(pagehelper)。
非功能性
- 基于springboot环境运行;
- 非侵入式,不影响springboot其他配置。
- 支持通过配置文件灵活切换、调整、分配数据源。
注意事项
-
多数据源分布式事务下,首先需要使用支持XA的数据库产品,目前主流数据库如oracle、db2、mysql等都支持
-
需要对数据库用户进行分布式事务相关授权,如下,否则会提示错误:
ResourceException: Error in recovery
grant select on sys.dba_pending_transactions to jeesite; grant select on sys.pending_trans$ to jeesite; grant select on sys.dba_2pc_pending to jeesite; grant execute on sys.dbms_system to jeesite;
如何使用
1、要使用多数据源自动配置,需要将springboot自带的DataSource相关自动配置类屏蔽自动启动。在springboot项目的启动类上添加如下注解(若引用了druid等第三方数据源,也需将其自配置类屏蔽)
@EnableAutoConfiguration(exclude = { XADataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class,DataSourceAutoConfiguration.class})
2、配置applicaion.properties参数
DataSource相关配置
spring.multi-datasource
为识别多数据源配置的prefix,其他参数基本继承自各框架自身提供的可配置参数,只有prefix不同,例如:
spring.multi-datasource.xxx.*
等同于Spring DataSource配置:spring.datasource.*
spring.multi-datasource.xxx.mybatis.*
等同于mybatis配置:mybatis.*
spring.multi-datasource.xxx
xxx为可自定义的数据源名称,用于区分不同数据源,全局唯一,且不同数据源的配置相互独立spring.multi-datasource.xxx.xa.*
提供配置支持分布式事务的数据源的相关参数,若要使用druid连接池,则需要使用spring.multi-datasource.oracle.xa.data-source-class-name
指定druid数据源名称,默认使用springboot数据源构造器,默认连接池为Hikari
mybatis相关配置
- 使用prefix
spring.multi-datasource.xxx.mybatis.*
代替mybatis的配置prefixmybatis.*
即可
不同数据源配置的mybatis只对当前数据源有效,所以可实现不同模块使用不同数据源,例如:spring.multi-datasource.oracle.mybatis.mapper-locations=classpath*:mybatis/*1Mapper.xml spring.multi-datasource.oracle.mybatis.type-aliases-package=com.cvicse.test.bo.base spring.multi-datasource.oracle.base-packages=com.cvicse.test.dao
pagehelper相关配置
- 使用prefix
spring.multi-datasource.mysql.pagehelper.*
代替pagehelper的配置prefixpagehelper.*
即可
application.properties 参考
server.port=8080
spring.multi-datasource.oracle.xa.data-source-class-name=com.alibaba.druid.pool.xa.DruidXADataSource
spring.multi-datasource.oracle.driver-class-name=oracle.jdbc.OracleDriver
spring.multi-datasource.oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
spring.multi-datasource.oracle.username=******
spring.multi-datasource.oracle.password=******
spring.multi-datasource.oracle.mybatis.mapper-locations=classpath*:mybatis/*1Mapper.xml
spring.multi-datasource.oracle.mybatis.type-aliases-package=com.cvicse.test.bo.base
spring.multi-datasource.oracle.base-packages=com.cvicse.test.dao
spring.multi-datasource.db2.username=******
spring.multi-datasource.db2.password=******
spring.multi-datasource.db2.url=jdbc:db2://127.0.0.1:50000/msdb
spring.multi-datasource.db2.mybatis.mapper-locations=classpath*:mybatis/*2Mapper.xml
spring.multi-datasource.db2.mybatis.type-aliases-package=com.cvicse.test2.bo.base
spring.multi-datasource.db2.base-packages=com.cvicse.test2.dao
spring.multi-datasource.mysql.username==******
spring.multi-datasource.mysql.password==******
spring.multi-datasource.mysql.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=true
spring.multi-datasource.mysql.mybatis.mapper-locations=classpath*:mybatis/*2Mapper.xml
spring.multi-datasource.mysql.mybatis.type-aliases-package=com.cvicse.test2.bo.base
spring.multi-datasource.mysql.base-packages=com.cvicse.test2.dao
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?