🎉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统计

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

相关推荐
天才奇男子14 小时前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
qq_2975746715 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
tb_first18 小时前
LangChain4j简单入门
java·spring boot·langchain4j
凯子坚持 c20 小时前
C++基于微服务脚手架的视频点播系统---客户端(4)
数据库·c++·微服务
老百姓懂点AI21 小时前
[微服务] Istio流量治理:智能体来了(西南总部)AI调度官的熔断策略与AI agent指挥官的混沌工程
人工智能·微服务·istio
计算机学姐1 天前
基于SpringBoot的民宿预定管理系统【三角色+个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·mysql·信息可视化·intellij-idea·推荐算法
计算机程序设计小李同学1 天前
基于 Spring Boot + Vue 的龙虾专营店管理系统的设计与实现
java·spring boot·后端·spring·vue
LiZhen7981 天前
SpringBoot 实现动态切换数据源
java·spring boot·mybatis
JZC_xiaozhong1 天前
多系统权限标准不统一?企业如何实现跨平台统一权限管控
java·大数据·微服务·数据集成与应用集成·iam系统·权限治理·统一权限管理
qq_12498707531 天前
基于Java Web的城市花园小区维修管理系统的设计与实现(源码+论文+部署+安装)
java·开发语言·前端·spring boot·spring·毕业设计·计算机毕业设计