在Spring Boot 3.3中使用Druid数据源及其监控功能

在Spring Boot 3.3中使用Druid数据源及其监控功能

在Spring Boot项目中,数据源是与数据库进行交互的核心组件。默认情况下,Spring Boot 3.3使用HikariCP作为数据源,但有时我们可能需要更强大的功能,比如SQL监控、慢SQL记录和详细的连接池管理。这时,Druid是一个非常合适的选择。Druid是阿里巴巴开源的一个功能强大的数据库连接池,它不仅提供了高效的连接管理,还支持丰富的监控功能。

1. Druid数据源与Spring Boot默认数据源的关系

Spring Boot默认使用HikariCP作为数据源,它是一个高性能的数据库连接池。然而,Druid提供了更多的功能,比如SQL监控、慢SQL记录和详细的连接池管理。通过在Spring Boot项目中引入Druid,可以替换默认的HikariCP数据源。

以下是Druid数据源与Spring Boot默认数据源的关系以及相关类的类图:
initializeDataSourceBuilder() initializeDataSourceBuilder() getStatViewServlet() getWebStatFilter() <<Interface>> DataSource +getConnection() +close() HikariDataSource +getConnection() +close() DruidDataSource +getConnection() +close() +setValidationQuery() +setInitialSize() +setMaxActive() +setMinIdle() +setMaxWait() +setTimeBetweenEvictionRunsMillis() +setMaxEvictableIdleTimeMillis() +setValidationQuery() +setTestWhileIdle() +setTestOnBorrow() +setTestOnReturn() +setPoolPreparedStatements() +setMaxOpenPreparedStatements() +setKeepAlive() DataSourceProperties +initializeDataSourceBuilder() +determineUrl() DruidStatProperties +getStat() +getWebStatFilter() +getStatViewServlet() StatViewServlet +doGet() +doPost() WebStatFilter +doFilter()

  • DataSource 是一个接口,定义了 getConnection()close() 方法。
  • HikariDataSourceDruidDataSource 都实现了 DataSource 接口。
  • DataSourceProperties 用于配置数据源的属性,可以通过 initializeDataSourceBuilder() 方法初始化 HikariDataSourceDruidDataSource
  • DruidStatProperties 用于配置 Druid 的监控功能,包括 StatViewServletWebStatFilter

2. 添加依赖

pom.xml中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>1.2.20</version>
</dependency>

3. 配置Druid数据源

application.yml文件中,配置Druid数据源的基本信息和连接池参数:

yaml 复制代码
spring:
  application:
    name: spring-boot-demo
  datasource:
    url: jdbc:mysql://localhost:3306/db_spring_boot_demo?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      test-while-idle: true
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 30000
      validation-query: select 'x'
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: false
      filters: stat,wall,slf4j
      max-pool-prepared-statement-per-connection-size: -1
      use-global-data-source-stat: true
      connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

4. 配置Druid监控功能

application.yml中,配置Druid的监控功能,包括StatViewServletWebStatFilter

yaml 复制代码
spring:
  datasource:
    druid:
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: false
        login-username: admin
        login-password: admin
        allow: 127.0.0.1
        deny:

完整的配置如下:

yaml 复制代码
spring:
  application:
    name:  spring-boot-demo
  datasource:
    url: jdbc:mysql://localhost:3306/db_spring_boot_demo?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    # druid-spring-boot-starter 依赖自动生效 druid,可以不配置 type 属性,但建议配置
    type: com.alibaba.druid.pool.DruidDataSource
    # druid 连接池管理
    druid:
      # 初始化时建立物理连接的个数
      initial-size: 5
      # 连接池的最小空闲数量
      min-idle: 5
      # 连接池最大连接数量
      max-active: 20
      # 获取连接时最大等待时间,单位毫秒
      max-wait: 60000
      # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-while-idle: true
      # 既作为检测的间隔时间又作为testWhileIdel执行的依据
      time-between-eviction-runs-millis: 60000
      # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)
      min-evictable-idle-time-millis: 30000
      # 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)
      validation-query: select 'x'
      # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-borrow: false
      # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-return: false
      # 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。
      pool-prepared-statements: false
      # 置监控统计拦截的filters,去掉后监控界面sql无法统计,stat: 监控统计、Slf4j:日志记录、waLL: 防御sqL注入
      filters: stat,wall,slf4j
      # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
      max-pool-prepared-statement-per-connection-size: -1
      # 合并多个DruidDataSource的监控数据
      use-global-data-source-stat: true
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

      web-stat-filter:
        # 是否启用StatFilter默认值true
        enabled: true
        # 添加过滤规则
        url-pattern: /*
        # 忽略过滤的格式
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico

      stat-view-servlet:
        # 是否启用StatViewServlet默认值true
        enabled: true
        # 访问路径为/druid时,跳转到StatViewServlet
        url-pattern: /druid/*
        # 是否能够重置数据
        reset-enable: false
        # 需要账号密码才能访问控制台,默认为root
        login-username: admin
        login-password: admin
        # IP白名单
        allow: 127.0.0.1
        # IP黑名单(共同存在时,deny优先于allow)
        deny:

5. 启动项目并访问监控页面

启动Spring Boot项目后,访问http://localhost:8080/druid,使用用户名admin和密码admin登录。登录后,你将看到Druid监控页面,其中包含了以下功能:

5.1 SQL监控

在监控页面中,点击"SQL监控"选项卡,可以查看所有执行的SQL语句及其详细信息。这对于优化SQL性能非常有帮助。

5.2 慢SQL记录

通过配置druid.stat.slowSqlMillis=5000,Druid会记录执行时间超过5秒的SQL语句。这些慢SQL语句可以在监控页面中查看,帮助开发者快速定位性能瓶颈。

5.3 数据库连接池监控

Druid提供了详细的连接池监控信息,包括:

  • 活跃连接数:当前正在使用的连接数。
  • 空闲连接数:当前未使用的连接数。
  • 等待连接数:等待获取连接的线程数。
  • 最大连接数:连接池允许的最大连接数。

这些信息可以帮助开发者合理配置连接池参数,优化数据库连接的使用效率。

6. 注意事项

6.1 依赖版本

确保使用与Spring Boot 3.3兼容的Druid版本。如果使用了不兼容的版本,可能会导致配置无法生效或出现其他问题。

6.2 安全性

在生产环境中,建议对数据库密码进行加密,并限制Druid监控页面的访问权限,以防止敏感信息泄露。可以通过配置allowdeny属性来限制访问IP。

6.3 Spring Security配置

如果你的项目中使用了Spring Security,可能需要为Druid监控页面配置访问权限。例如:

java 复制代码
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/druid/**").permitAll() // 允许访问Druid监控页面
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .csrf().disable();
    }
}

7. 总结

通过上述步骤,你可以在Spring Boot 3.3项目中成功集成Druid数据源,并启用其强大的监控功能。Druid不仅提供了高效的连接管理,还支持SQL监控、慢SQL记录和详细的连接池监控功能,帮助开发者优化数据库操作。希望本文对你有所帮助!


希望这篇博客能够帮助其他开发者快速上手使用Druid数据源及其监控功能!如果你有任何问题或需要进一步的帮助,欢迎随时联系我。


以我之思,借AI之力

相关推荐
java干货2 分钟前
虚拟线程与消息队列:Spring Boot 3.5 中异步架构的演进与选择
spring boot·后端·架构
一只叫煤球的猫6 分钟前
MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
后端·sql·mysql
SoFlu软件机器人9 分钟前
智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
java·开发语言·架构
写bug写bug1 小时前
如何正确地对接口进行防御式编程
java·后端·代码规范
Cyanto1 小时前
Java并发编程面试题
java·开发语言·面试
不超限1 小时前
Asp.net core 使用EntityFrame Work
后端·asp.net
在未来等你1 小时前
互联网大厂Java求职面试:AI大模型与云原生技术的深度融合
java·云原生·kubernetes·生成式ai·向量数据库·ai大模型·面试场景
豌豆花下猫1 小时前
Python 潮流周刊#105:Dify突破10万星、2025全栈开发的最佳实践
后端·python·ai
sss191s2 小时前
Java 集合面试题从数据结构到 HashMap 源码剖析详解及常见考点梳理
java·开发语言·数据结构