1.Druid连接池配置
--- #################### 数据库相关配置 ####################
spring:
# 数据源配置项
autoconfigure:
exclude:
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
datasource:
druid: # Druid 【监控】相关的全局配置
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
allow: # 设置白名单,不填则允许所有访问
url-pattern: /druid/*
login-username: # 控制台管理用户名和密码
login-password:
filter:
stat:
enabled: true
log-slow-sql: true # 慢 SQL 记录
slow-sql-millis: 100
merge-sql: true
wall:
config:
multi-statement-allow: true
dynamic: # 多数据源配置
druid: # Druid 【连接池】相关的全局配置
initial-size: 5 # 初始连接数
min-idle: 10 # 最小连接池数量
max-active: 20 # 最大连接池数量
max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
test-while-idle: true
test-on-borrow: false
test-on-return: false
primary: master
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/mydatabase1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
password: 123456
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
url: jdbc:mysql://127.0.0.1:3306/mydatabase2?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
password: 12345
1. Druid 监控配置
Druid 提供了强大的监控功能,可以通过 Web 页面查看数据源的运行状态、SQL 执行情况等。
spring:
datasource:
druid:
web-stat-filter:
enabled: true # 启用 Druid 的 Web 统计过滤器,用于监控 Web 请求
stat-view-servlet:
enabled: true # 启用 Druid 的监控页面
allow: # 设置白名单,允许访问监控页面的 IP 地址,为空则表示允许所有访问
url-pattern: /druid/* # 监控页面的访问路径
login-username: # 监控页面的登录用户名
login-password: # 监控页面的登录密码
filter:
stat:
enabled: true # 启用 SQL 监控
log-slow-sql: true # 记录慢 SQL
slow-sql-millis: 100 # 定义慢 SQL 的阈值,单位:毫秒
merge-sql: true # 合并相同的 SQL 语句
wall:
config:
multi-statement-allow: true # 允许一次执行多条 SQL 语句
-
web-stat-filter
:用于监控 Web 请求的统计信息。 -
stat-view-servlet
:提供 Druid 的监控页面,可以通过浏览器访问/druid
路径查看。 -
filter.stat
:用于监控 SQL 执行情况,支持慢 SQL 记录和 SQL 合并。 -
filter.wall
:用于 SQL 防火墙,防止 SQL 注入等安全问题。
2. 多数据源配置
使用 dynamic-datasource-spring-boot-starter
配置多数据源,支持主从数据源、读写分离等功能。
spring:
datasource:
dynamic:
druid: # Druid 连接池的全局配置
initial-size: 5 # 初始连接数
min-idle: 10 # 最小空闲连接数
max-active: 20 # 最大活跃连接数
max-wait: 600000 # 获取连接的最大等待时间,单位:毫秒
time-between-eviction-runs-millis: 60000 # 检测空闲连接的间隔时间,单位:毫秒
min-evictable-idle-time-millis: 300000 # 连接在池中最小生存时间,单位:毫秒
max-evictable-idle-time-millis: 900000 # 连接在池中最大生存时间,单位:毫秒
validation-query: SELECT 1 FROM DUAL # 用于检测连接是否有效的 SQL
test-while-idle: true # 在连接空闲时检测连接是否有效
test-on-borrow: false # 在获取连接时检测连接是否有效
test-on-return: false # 在归还连接时检测连接是否有效
primary: master # 默认使用的主数据源
datasource:
master: # 主数据源配置
url: jdbc:mysql://127.0.0.1:3306/mydatabase1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root
password: 123456
slave: # 从数据源配置
lazy: true # 开启懒加载,延迟初始化从数据源,加快启动速度
url: jdbc:mysql://127.0.0.1:3306/mydatabase2?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root
password: 123456
-
druid
连接池配置:定义了 Druid 连接池的全局参数,如初始连接数、最小空闲连接数、最大活跃连接数等。 -
primary
:指定默认使用的主数据源。 -
datasource
:定义多个数据源,包括主数据源(master
)和从数据源(slave
)。 -
lazy: true
:从数据源开启懒加载,避免启动时初始化所有数据源,加快启动速度。
在application.yml配置文件中,通过 spring.datasource.dynamic
配置项,配置了 Master-Slave 主从两个数据源;
在方法上添加@Master注解,使用名字为 master
的数据源,即使用【主】库,一般适合【写】场景。
在方法上添加 @Slave 注解,使用名字为 slave
的数据源,即使用【从】库,一般适合【读】场景。
在方法上添加 @DS注解,使用指定名字的数据源,适合多数据源的情况。
2.分布式事务
在使用 Spring @Transactional 声明的事务中,无法进行数据源的切换,此时有 3 种解决方案:
① 拆分成多个 Spring 事务,每个事务对应一个数据源。如果是【写】场景,可能会存在多数据源的事务不一致的问题。
② 引入 Seata 框架,提供完整的分布式事务的解决方案;
③ 使用 Dynamic Datasource 提供的 @DSTransactional (opens new window)注解,支持多数据源的切换,不提供绝对可靠的多数据源的事务一致性(强于 ① 弱于 ②),可学习
2. 事务相关
事务一共有 3 种解决方案,分别是:
单机 + 单数据源:@Transactional 注解
单机 + 多数据源:@DSTransactional 注解
多机 + 单/多数据源:Seata 分布式事务
2.1 @Transactional 注解
大多数情况下,是单机 + 单个数据源的操作,只需要在方法上添加 Spring @Transactional 注解,声明事务即可。
具体的使用,可以项目里搜 @Transactional 关键字,就可以看到非常多的使用示例。
2.2 @DSTransactional 注解
如果单机 + 多个数据源的操作,使用 @Transactional 声明的事务中,无法进行数据源的切换。此时,可以使用 Dynamic Datasource 提供的 @DSTransactional (opens new window)注解,支持多数据源的切换。
友情提示:
@DSTransactional 注解,提供相对可靠的多数据源的事务一致性,但是不绝对。
使用的示例,AService 调用 BService、CService,并且分别对应 a、b、c 各自的数据源,代码如下所示:
public class AService {
@Resource
private BService bService;
@Resource
private CService cService;
@DS("a") // 注意:如果 a 是默认数据源时,则不需要 @DS 注解
@DSTransactional
public void create() {
bService.createB();
CService.createC();
}
}
public class BService {
@DS("b")
public void createB() {
// 调用 bMapper 逻辑
}
}
public class CService {
@DS("c")
public void createC() {
// 调用 cMapper 逻辑
}
}
点击并拖拽以移动
c 数据源的操作发生异常,a、b 数据源会回滚;
b、c 数据源的方法,也添加 @DSTransactional 注解,不会影响事务;