🎉Spring Boot 3 + 多数据源 + Druid:监控页面 + 控制台 SQL 日志,终于搞定啦!

Spring Boot 3.x + dynamic-datasource + Druid 的时候,最让人抓狂的就是:

  • 监控页面一访问就 "No static resource druid." 😱
  • 控制台死活不打印 SQL,只有出错才冒泡 🤬
  • 配置改了半天,还是不生效...

经过无数次重启、翻源码、看 Issue,我终于整出一套超级稳定的方案!监控页面美美哒,多数据源切换顺滑,控制台 SQL 日志带参数打印(正常+出错都行)。

来来来,直接上干货~轻松复制粘贴,就能跑起来!

先加依赖,别多加!

XML

xml 复制代码
<dependencies>
    <!-- 多数据源神器 -->
    <dependency>
        <groupId>com.baomidou</groupId>
	    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> <!-- 多数据源 -->
        <version>4.3.1</version>  <!-- 最新版最香 -->
    </dependency>

    <!-- Druid 的 Spring Boot 3 专用 starter -->
    <dependency>
        <groupId>com.alibaba</groupId>
		<artifactId>druid-spring-boot-3-starter</artifactId>
        <version>1.2.27</version>
        <exclusions>
            <exclusion>
                <artifactId>druid</artifactId>
                <groupId>com.alibaba</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <!-- 强制核心 druid 为 1.2.27 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.27</version>
    </dependency>
</dependencies>

一般只加这一个 Druid starter 就够啦!但是使用的是最新的1.2.27的包,druid-spring-boot-3-starter依赖的是1.2.9,所以需要强制添加核心,是否依赖正确的包,可以通过maven help来排查冲突:

排除原生自动配置(超级重要!不然各种冲突)

在 application.yml 里加:

YAML

yaml 复制代码
spring:
  autoconfigure:
    exclude:
      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

或者直接在启动类上怼注解:

Java

python 复制代码
@SpringBootApplication(exclude = com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure.class)

yml 配置(连接池 + Filter)

YAML

yaml 复制代码
spring:
  datasource:
    dynamic:
      primary: master
      druid:
        initial-size: 5
        min-idle: 10
        max-active: 20
        max-wait: 60000
        # 其他连接池参数随便调~

        filters: stat,wall,slf4j  # stat 监控,wall 防注入,slf4j 打印日志

        filter:
          slf4j:
            enabled: true
            statement-executable-sql-log-enable: true   # 带参数美化 SQL
            statement-log-enabled: false                # 关掉原始 ? 日志,别重复
            result-set-log-enabled: false

      datasource:
        master:
          url: jdbc:mysql://localhost:3306/db1?xxx
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave:
          # 同上...

手动注册监控页面(最稳!自动配置容易翻车)

1.2.27并没有默认开始监控页面,需要我们自己配置,新建一个配置类 DruidMonitorConfig.java:

Java

java 复制代码
import com.alibaba.druid.support.jakarta.StatViewServlet;
import com.alibaba.druid.support.jakarta.WebStatFilter;
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;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.HashMap;

@Configuration
public class DruidMonitorConfig {

    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>();
        bean.setServlet(new StatViewServlet());
        bean.addUrlMappings("/druid/*");

        var params = new HashMap<String, String>();
        params.put("loginUsername", "admin");
        params.put("loginPassword", "123456");
        params.put("allow", "");
        params.put("resetEnable", "false");
        bean.setInitParameters(params);
        return bean;
    }

    @Bean
    public FilterRegistrationBean<WebStatFilter> webStatFilter() {
        FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new WebStatFilter());
        bean.addUrlPatterns("/*");

        var params = new HashMap<String, String>();
        params.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        bean.setInitParameters(params);
        return bean;
    }

    // 静态资源,别忘了!
    @Bean
    public WebMvcConfigurer druidResources() {
        return new WebMvcConfigurer() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/druid/**")
                        .addResourceLocations("classpath:/support/http/resources/");
            }
        };
    }
}

其中资源的路径跟很多网站与ai说的都不一样,正确的是:/support/http/resources/

logback 让日志蹦出来

XML,重要也简单,网上很多配置都出错,这是通过调试源码找到的配置。甚至很多ai也都给出错误的配置:

正确的打开方式如下:

ini 复制代码
<logger name="druid.sql.Statement" level="DEBUG"/>

效果图(文字版哈哈)

控制台正常 SQL:

text

sql 复制代码
DEBUG com.alibaba.druid.filter.logging.Slf4jLogFilter - executable sql: 
select * from user where id = ? and age > ?
==> Parameters: 1(Long), 18(Integer)
==> Total: 3

出错 SQL 也会强制打印~

监控页面:访问 /druid/,admin/123456 登录,就能看到 master/slave 切换、SQL 统计、慢查询,爽!

SQL统计

注意:这个版本的重置功能失效!

相关推荐
米丘16 小时前
微前端之 Web Components 完全指南
微服务·html
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
昵称为空C2 天前
手撸一个动态 SQL 执行引擎:不重启服务,在线增删改查任意数据库
spring boot·后端
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
于先生吖3 天前
SpringBoot对接大模型开发AI命理测算系统:八字排盘与AI解析接口源码全解
人工智能·spring boot·后端
Flittly3 天前
【AgentScope Java新手村系列】(10)实战-多Agent天气助手
java·spring boot·spring
星落zx4 天前
Spring Boot 多模型集成:优雅调用全球主流大模型
人工智能·spring boot·chatgpt
一杯奶茶¥4 天前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
进阶的小名4 天前
Spring Boot SSE + Nginx 配置:解决 EventSource 不实时返回、连接超时、流式响应被缓冲问题
spring boot·后端·nginx