mybatisplus多数据源配置
链接: mybatisplus官网.
多数据源特性:
支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
支持数据库敏感配置信息 加密 ENC()。
支持每个数据库独立初始化表结构schema和数据库database。
支持 自定义注解 ,需继承DS(3.2.0+)。
提供对Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
简化Druid和HikariCp配置,提供 全局参数配置 。配置一次,全局通用。
提供 自定义数据源来源 方案。
提供项目启动后 动态增加移除数据源 方案。
提供Mybatis环境下的 纯读写分离 方案。
提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
提供对shiro,sharding-jdbc,quartz等第三方库集成的方案,注意事项和示例。
提供 基于seata的分布式事务方案。 附:不支持原生spring事务。
基本的配置根据官网一步一步来即可
注意点
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
dynamic:
primary: system #设置默认的数据源或者数据源组
strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
datasource:
database1:
url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
#连接池可以在每个数据源下面单独配置,也可抽出成公共配置
hikari:
maximum-pool-size: 100
minimum-idle: 20
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
database2:
........
疑似坑点:碰到了多数据源依赖在mybatisplus核心依赖之后,多数据源依赖无法引入的问题(可能是个人环境问题)。
重要:mybatisplus官方并没有提供事务的实现
引入mybatisplus的多数据源配置后,无法使用spring的原生事务,强行使用@Transactional注解后会出现默认使用第一个数据源作为连接,此时,如果是查询非默认数据源数据,会报表不存在的异常。
网上的多数据源事务配置比较繁琐,这里实验了一种比较简单的多数据源事务配置
注:只支持单个数据源事务,多数据源之间的事务不支持
原因:使用@DS注解动态切换数据源之后spring自带事务并不知道有哪些数据源,那么解决也就从这里开始
第一步
//注入数据源给jta事务管理器,在使用spring原生事务注解时,指定事务管理器TransactionManager,由jta对多数据源进行管理(这里未尝试其他事务管理器,感兴趣的可以尝试一下)
@Bean(name = "TransactionManager")
@Primary
@Order(2)
public DataSourceTransactionManager TransactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
第二步
//在service层的方法上注解相应的事务和@DS
//这里有一个坑,如果@Transactional注解在service层,@DS注解到mapper上是不会起作用的,二者必须同时注解在service方法上,所以,在mapper上也要加,service的事务方法也要加,这样其他不需要事务的方法不会报错,事务方法也会生效。
@Transactional(transactionManager = "TransactionManager")
@DS("chddata")
public void serviceMethod(){
}