java每日精进 3.10 【多数据源补充】

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 注解,不会影响事务;

2.3 分布式事务Seata


3. 分库分表

猜你喜欢

转载自blog.csdn.net/weixin_51721783/article/details/146144569
今日推荐