最近做了一个自动支持多数据源配置的功能,基于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
myabits相关配置
- 使用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