周行文 2025-08-27 07:35 采纳率: 98.6%
浏览 10
已采纳

问题:Druid连接池获取已关闭连接的原因及解决方案?

**问题描述:** 在使用阿里巴巴的Druid连接池时,有时会出现从连接池中获取到**已关闭的数据库连接**,导致程序在执行SQL时抛出异常,如`MySQLNonTransientConnectionException`或`Connection is closed`等错误。这种情况会影响系统的稳定性和数据库操作的正常执行。 **常见原因包括:** 1. **连接空闲超时**:数据库主动关闭了长时间未使用的连接,而Druid未及时检测到。 2. **未正确配置检测机制**:如`testWhileIdle`、`validationQuery`等参数未启用或配置不当。 3. **连接泄漏**:连接未正确归还连接池,导致后续获取到空连接。 4. **网络或数据库异常重启**:导致连接中断但未被清理。 **解决方案:** - 启用连接有效性检测,配置合适的`validationQuery`和检测时机。 - 合理设置`minEvictableIdleTimeMillis`和`timeBetweenEvictionRunsMillis`进行空闲连接回收。 - 开启`removeAbandoned`功能,防止连接泄漏。 - 使用`initConnectionSqls`初始化连接状态。 通过合理配置Druid连接池,可以有效避免获取已关闭连接的问题,提升系统稳定性与数据库访问可靠性。
  • 写回答

1条回答 默认 最新

  • 小丸子书单 2025-08-27 07:35
    关注

    一、问题现象与背景

    在使用阿里巴巴的Druid连接池时,有时会出现从连接池中获取到已关闭的数据库连接,导致程序在执行SQL时抛出异常,如MySQLNonTransientConnectionExceptionConnection is closed等错误。这种情况会影响系统的稳定性和数据库操作的正常执行。

    二、常见原因分析

    出现该问题的主要原因包括:

    1. 连接空闲超时:数据库主动关闭了长时间未使用的连接,而Druid未及时检测到。
    2. 未正确配置检测机制:如testWhileIdlevalidationQuery等参数未启用或配置不当。
    3. 连接泄漏:连接未正确归还连接池,导致后续获取到空连接。
    4. 网络或数据库异常重启:导致连接中断但未被清理。

    三、解决方案详解

    为解决上述问题,建议从以下几个方面进行配置优化:

    1. 启用连接有效性检测机制

    Druid提供了连接有效性检测功能,可以通过以下参数进行配置:

    • testWhileIdle:是否在连接空闲时进行有效性检测。
    • validationQuery:用于检测连接是否有效的SQL语句,例如SELECT 1
    • testOnBorrowtestOnReturn:是否在获取或归还连接时进行检测(不推荐开启,影响性能)。
    
    testWhileIdle=true
    validationQuery=SELECT 1
    testOnBorrow=false
    testOnReturn=false
        

    2. 配置空闲连接回收策略

    Druid通过空闲连接回收机制来避免连接长时间空闲导致失效。关键参数如下:

    参数名说明推荐值
    minEvictableIdleTimeMillis连接在池中最小生存时间,超过该时间将被回收300000(5分钟)
    timeBetweenEvictionRunsMillis空闲连接回收线程运行间隔60000(1分钟)

    3. 开启连接泄漏检测与回收

    Druid支持连接泄漏的自动回收机制,关键参数如下:

    • removeAbandoned:是否开启连接泄漏回收。
    • removeAbandonedTimeout:连接未归还超过该时间将被回收。
    • logAbandoned:是否记录泄漏连接的堆栈信息。
    
    removeAbandoned=true
    removeAbandonedTimeout=60
    logAbandoned=true
        

    4. 初始化连接状态

    在连接池初始化或连接被回收后重新创建时,可以使用以下参数设置连接初始化SQL:

    
    initConnectionSqls=SET NAMES utf8mb4;SET time_zone = '+8:00'
        

    四、流程图:Druid连接池获取连接流程

    graph TD A[应用请求获取连接] --> B{连接池是否有可用连接?} B -->|是| C[返回连接] B -->|否| D[尝试创建新连接] D --> E{是否超过最大连接数?} E -->|否| F[创建新连接并返回] E -->|是| G[等待或抛出异常] C --> H{连接是否有效?} H -->|否| I[尝试验证连接] I --> J{验证是否通过?} J -->|是| K[返回有效连接] J -->|否| L[关闭无效连接,重新获取]

    五、总结建议

    在实际生产环境中,合理配置Druid连接池的检测、回收和泄漏机制,可以有效避免获取已关闭连接的问题,提升系统稳定性与数据库访问可靠性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 8月27日