若依springboot3版本集成dynamic-datasource实现动态数据源切换

1.删除原来的相关配置

  • DruidConfig.java
  • DruidProperties.java
  • DynamicDataSource.java
  • DynamicDataSourceContextHolder.java
  • DataSourceAspect.java

2.引入依赖

1.主pom.xml映入

<dynamic-datasource.version>4.2.0</dynamic-datasource.version>

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
    <version>${dynamic-datasource.version}</version>
</dependency>

2.common模块引入

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
</dependency>

3.修改数据库配置

spring:
  datasource:
    dynamic:
      # druid连接池设置
      druid:
        monitor:
          allow: 127.0.0.1,localhost  # 允许多个IP或网段
          deny: 192.168.1.100              # 拒绝特定IP
          username: admin
          password: admin123  # 从环境变量或配置中心获取
          resetEnable: false               # 生产环境禁用重置
          exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,*.html"
        # 配置初始化线程数
        initial-size: 5
        # 最小线程数
        min-idle: 5
        # CPU核数+1,也可以大些但不要超过20,数据库加锁时连接过多性能下降
        max-active: 11
        # 最大等待时间,内网:800,外网:1200(三次握手1s)
        max-wait: 60000
        # 连接可空闲存活时间(ms)
        time-between-eviction-runs-millis: 60000
        # 连接保持空闲而不被驱逐的最长存活时间(ms)
        min-evictable-idle-time-millis: 300000
        # 用来检测连接是否有效的sql
        validation-query: SELECT 1
        # 建议配置为true,不影响性能,并且保证安全性
        test-while-idle: true
        # 建议配置为false,申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        test-on-borrow: false
        # 建议配置为false,归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        test-on-return: false
        # PSCache对支持游标的数据库性能提升巨大
        pool-prepared-statements: true
        # 配置监控统计拦截的filters,wall用于防火墙
        filters: stat,wall
        # 保持minIdle数量的长连接
        keep-alive: true
        # 要启用PSCache,必须配置大于0
        max-pool-prepared-statement-per-connection-size: 20
        # 是否合并多个DruidDataSource的监控数据
        use-global-data-source-stat: true
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connection-properties:
          druid.stat.mergeSql: true
          druid.stat.slowSqlMillis: 500
        # 移除废弃连接
        remove-abandoned: true
        log-abandoned: true
        # 物理连接最大使用次数
        phy-max-use-count: 1000
      primary: master
      datasource:
        # 主库数据源
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
          username: root
          password: 123456
        # 从库数据源
        test:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/ry_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
          username: root
          password: 123456

4.添加连接池监控配置

import com.alibaba.druid.support.jakarta.StatViewServlet;
import com.alibaba.druid.support.jakarta.WebStatFilter;
import jakarta.servlet.Filter;
import jakarta.servlet.Servlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DruidConfig {
	private static final Logger logger = LoggerFactory.getLogger(DruidConfig.class);
	
	@Value("${spring.datasource.dynamic.druid.monitor.allow:127.0.0.1}")
	private String allow;
	
	@Value("${spring.datasource.dynamic.druid.monitor.deny:}")
	private String deny;
	
	@Value("${spring.datasource.dynamic.druid.monitor.username:admin}")
	private String username;
	
	@Value("${spring.datasource.dynamic.druid.monitor.password:admin123}")
	private String password;
	
	@Value("${spring.datasource.dynamic.druid.monitor.resetEnable:false}")
	private String resetEnable;
	
	@Value("${spring.datasource.dynamic.druid.monitor.exclusions:*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*}")
	private String exclusions;
	
	/**
	 * 配置Druid监控启动页面
	 */
	@Bean
	@ConditionalOnMissingBean
	public ServletRegistrationBean<Servlet> druidStartViewServlet() {
		logger.info("Initializing Druid StatViewServlet with allow={}, username={}", allow, username);
		ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
		// 白名单
		servletRegistrationBean.addInitParameter("allow", allow);
		// 黑名单
		if (!deny.isEmpty()) {
			servletRegistrationBean.addInitParameter("deny", deny);
		}
		// 登录查看信息的账密,用于登录Druid监控后台
		servletRegistrationBean.addInitParameter("loginUsername", username);
		servletRegistrationBean.addInitParameter("loginPassword", password);
		// 是否能够重置数据
		servletRegistrationBean.addInitParameter("resetEnable", resetEnable);
		return servletRegistrationBean;
	}
	
	/**
	 * Druid监控过滤器配置规则
	 */
	@Bean
	@ConditionalOnMissingBean
	public FilterRegistrationBean<Filter> filterRegistrationBean() {
		logger.info("Initializing Druid WebStatFilter with exclusions={}", exclusions);
		FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
		filterFilterRegistrationBean.setFilter(new WebStatFilter());
		// 添加过滤规则
		filterFilterRegistrationBean.addUrlPatterns("/*");
		// 添加不需要忽略的格式信息
		filterFilterRegistrationBean.addInitParameter("exclusions", exclusions);
		// 可以添加其他参数,如session统计
		filterFilterRegistrationBean.addInitParameter("sessionStatEnable", "true");
		filterFilterRegistrationBean.addInitParameter("principalSessionName", "username");
		return filterFilterRegistrationBean;
	}
}

    添加后访问 就可以查看数据库连接池信息Druid Stat JSON APIhttp://127.0.0.1:8080/druid/api.html

5.使用

默认使用的是主数据库,当需要切换数据库的时候直接在mapper接口类上打上 @DS("test") 注解就行了,这个mapper里面的所有方法调用的都是test数据库里面的,如果只让一个接口切换数据库,就直接在这个接口上添加注解就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值