写在前面
dynamic-datasource-spring-boot-starter 是一个基于 springboot 的快速集成多数据源的启动器,该插件可以不依赖 MyBatis-Plus独立使用。适用于多种场景:纯粹多库、读写分离、一主多从、混合模式,支持数据源的分组。 中文文档
特性
A. 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。 B. 支持数据库敏感配置信息 加密(可自定义) ENC()。 C. 支持每个数据库独立初始化表结构schema和数据库database。 D. 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。 E. 支持 自定义注解 ,需继承DS(3.2.0+)。 F. 提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。 G. 提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。 H. 提供 自定义数据源来源 方案(如全从数据库加载)。 I. 提供项目启动后 动态增加移除数据源 方案。 J. 提供Mybatis环境下的 纯读写分离 方案。 K. 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。 L. 支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。 M. 提供 基于seata的分布式事务方案 。 N. 提供 本地多数据源事务方案。
约定
A. 本框架只做多数据源切换这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。 B. 配置文件所有以下划线 _ 分割的数据源的第一部分即为组的名称,相同组名称的数据源会放在一个组下。 C. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。 D. 默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。 E. 方法上的注解优先于类上注解。 F. DS支持继承抽象类上的DS,暂不支持继承接口上的DS。
①. 添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
另: 还需要添加其他的数据库的驱动依赖
②. 修改配置
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
dynamic:
primary: master
strict: false
druid:
initial-size: 5
min-idle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,slf4j
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/servicex-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
slave_1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/servicex-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
slave_2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/servicex-cloud2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
spring:
datasource:
dynamic:
datasource:
master_1:
master_2:
slave_1:
slave_2:
slave_3:
spring:
datasource:
dynamic:
primary: mysql
datasource:
mysql:
oracle:
mongodb:
postgresql:
③. 添加注解
public interface NoticeMapper {
@DS("master")
public Notice selectNoticeById(Long noticeId);
@DS("slave")
public List<Notice> selectNoticeList(Notice notice);
}
A. @DS("xxx")可以注解在方法上和类上,如果同时存在,方法注解优先于类上注解。
强烈建议注解在 service 实现类或 mapper 接口方法上;
B. @DS("xxx") 指定使用 xxx 这个数据源,xxx 可以为组名也可以为具体某个数据源的名称。
如果是组名,则切换时采用轮询负载均衡算法切换。
如果指定的组名或者数据源不存在,且当strict=false时,则自动使用默认数据源(主库);
C. 如果方法上和类上未指定@DS("xxx"),则使用默认数据源(主库);
D. 如果@DS("xxx") 指定的是一个分组,且该分组下有多个数据库,那么会自动进行负载均衡。
E. 配置文件中所有以下划线 _ 分割的数据源,按照下划线 _ 分割分隔后的,前半部分即为组的名称,
相同组名称的数据源会放在一个组下。
如上所示在一主多从的场景中,slave_1和slave_2的组为slave,当配置@DS("slave")时,
slave_1和slave_2这两个数据源便会自动进行轮询负载均衡。
|