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数据库里面的,如果只让一个接口切换数据库,就直接在这个接口上添加注解就行了。