Java Druid连接池案例如何使用

wen java案例 30

Java Druid连接池案例如何使用:从入门到实战的完整指南

📚 目录导读

  1. 为什么选择Druid连接池?

    性能优势与监控特性

    Java Druid连接池案例如何使用

  2. 环境准备与依赖配置

    Maven/Gradle依赖、JDBC驱动要求

  3. 核心配置参数详解

    初始化大小、最大活动数、超时时间等

  4. 实战案例:Spring Boot集成Druid

    配置类、DataSource注入、SQL监控

  5. 常见问题与解决方案

    连接泄露、慢SQL排查、防火墙绕过

  6. 问答环节

    开发中高频疑问解析


为什么选择Druid连接池?

Java应用与数据库交互时,频繁创建和销毁连接会严重拖慢性能,连接池通过复用连接提升效率,而Druid作为阿里开源的数据库连接池工具,不仅性能优于DBCP/C3P0,还内置了强大的监控和扩展功能,它能实时展示SQL执行时间、连接获取次数、慢SQL日志等,对排查性能瓶颈极有帮助。

核心特性

  • 支持PSCache(预编译语句缓存)
  • 内置日志、监控、防御SQL注入等Filter
  • 可配置的策略如:testWhileIdle,保证连接有效性

环境准备与依赖配置

1 Maven依赖(Java 8+)

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.20</version> <!-- 使用最新稳定版 -->
</dependency>

若使用Spring Boot,可引入druid-spring-boot-starter简化配置。

2 数据库驱动

以MySQL为例,需同时引入:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

核心配置参数详解

参数名 默认值 说明 推荐值
initialSize 0 初始化连接数 5-10
maxActive 8 最大活动连接数 20-50 (根据并发)
minIdle 0 最小空闲连接数 5
maxWait -1 (无限等待) 获取连接最大等待毫秒数 3000(3秒)
timeBetweenEvictionRunsMillis 60000 空闲连接检查周期 60000
minEvictableIdleTimeMillis 300000 连接最大空闲时间 300000
testWhileIdle true 空闲时检测连接有效性 true
poolPreparedStatements false 是否缓存PreparedStatement true(可提升性能)

注意validationQuery需设为SELECT 1(MySQL)或SELECT 1 FROM DUAL(Oracle)。


实战案例:Spring Boot集成Druid

1 配置文件(application.yml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    druid:
      initial-size: 5
      max-active: 20
      min-idle: 5
      max-wait: 3000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      # 监控配置
      filters: stat,wall,log4j2
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: false
        login-username: admin
        login-password: admin123

2 访问Druid监控

启动项目后,访问:
http://localhost:8080/druid/login.html
输入配置的用户名/密码,即可查看:

  • 数据源:连接池活动、空闲等实时数据
  • SQL监控:执行频率、最慢SQL、事务分布
  • URI监控:常见请求耗时统计

3 代码中获取连接(示例)

@Autowired
private DataSource dataSource;
public void query() {
    try (Connection conn = dataSource.getConnection();
         PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE id = ?")) {
        ps.setInt(1, 1);
        ResultSet rs = ps.executeQuery();
        // 处理结果...
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

常见问题与解决方案

❌ 问题:连接泄露(activeCount持续增长)

原因:未正确关闭ConnectionStatementResultSet
解决

  • 使用try-with-resources自动关闭
  • 开启Druid的removeAbandoned配置:
    remove-abandoned: true
    remove-abandoned-timeout-millis: 180000  # 3分钟未归还视为泄露
    log-abandoned: true

❌ 问题:慢SQL导致线程阻塞

步骤

  1. 在Druid监控页面查看“慢SQL记录”
  2. 分析执行计划(EXPLAIN
  3. 添加索引或优化SQL逻辑

❌ 问题:防火墙(wall filter)误拦截

场景:某些动态SQL如ORDER BY #{column}被拦截。
解决

  • 临时关闭wall filter测试
  • 调整规则:通过WallConfig配置白名单(如允许ORDER BY变量)

问答环节

Q1:Druid连接池和HikariCP哪个更好?
A:HikariCP社区活跃、性能略优;但Druid的监控和防御能力更全面(SQL防注入、日志审计),若项目需要可视化监控,Druid是首选;纯追求极致性能可选HikariCP。

Q2:如何动态修改Druid配置?
A:通过DruidDataSource的set方法可运行时调整,但修改maxActive可能导致连接池震荡,更稳妥的方式是:监控页面手动调整或使用配置中心(如Nacos)动态推送。

Q3:testOnBorrowtestWhileIdle有什么区别?
A

  • testOnBorrow=true:每次获取连接时都检测,保证连接肯定可用,但性能损耗大
  • testWhileIdle=true:仅在空闲连接检测时验证,推荐开启(配合timeBetweenEvictionRunsMillis

Q4:出现CLOSE_CONNECTION: Connection closed错误怎么办?
A:通常发生在数据库服务器重启后,连接池中的连接已经失效,解决办法:

  • 设置validationQuery并开启testWhileIdle
  • 添加timeBetweenEvictionRunsMillis使Druid定期检查并剔除失效连接

通过本文的配置示例和实战步骤,你可以快速在Spring Boot项目中部署Druid连接池,并利用内置监控优化SQL性能,记得根据业务并发量调整maxActiveminIdle,避免资源浪费或连接等待超时。Druid不仅是连接池,更是数据库健康的守护者

本文基于Druid v1.2.20撰写,所有URL中的localhost需替换为实际服务器IP或域名。

抱歉,评论功能暂时关闭!