开发者社区> 问答> 正文

testConnectionInternal method Bug

druid version: 1.2.15

T4.png

此处的校验空闲链接时长是不是应该取 minEvictableIdleTimeMillis 而不是 timeBetweenEvictionRunsMillis

原提问者GitHub用户ylq5126

展开
收起
山海行 2023-07-05 17:49:41 103 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    Druid 数据库连接池中的 testConnectionInternal() 方法主要用于测试连接是否可用。在该方法中,会创建一个新的连接,并通过执行 SELECT 1 等测试语句,来检查连接是否正常工作。如果测试成功,则表示连接可用,否则会抛出异常。

    如果您在使用 testConnectionInternal() 方法时出现了问题,可能是由于一些原因导致连接测试失败。以下是一些可能导致连接测试失败的原因和解决方法:

    数据库用户权限不足:如果连接池使用的数据库用户没有足够的权限执行 SELECT 1 等测试语句,则会导致连接测试失败。解决方法是,检查数据库用户权限,并授予必要的权限。

    数据库服务问题:如果数据库服务出现了故障或网络问题,则可能导致连接测试失败。解决方法是,检查数据库服务状态,并进行必要的修复和调整。

    连接池配置不合理:如果连接池配置不合理,可能会导致连接测试失败。例如,如果最大连接数设置过小,则可能会无法获取可用连接。解决方法是,检查连接池配置,并根据实际情况进行调整。

    数据库驱动版本不兼容:Druid 数据库连接池需要与数据库驱动版本兼容,否则可能会导致连接测试失败或连接池无法正常工作。解决方法是,检查您使用的数据库驱动版本是否与 Druid 数据库连接池兼容,并尝试升级或降级数据库驱动版本。

    2023-07-30 21:19:41
    赞同 展开评论 打赏
  • 先说结论,这里没问题。

    timeBetweenEvictionRunsMillis 是 60s minEvictableIdleTimeMillis 是 半小时 maxEvictableIdleTimeMillis 是7小时

    常规情况下,判断的idle是 60s(比如testWhileIdle也是这个值)。 minEvictableIdleTimeMillis过长,现在很多云环境,默认idle 15分钟的tcp连接会被SLB干掉。 7小时明显是为了mysql默认的那个8小时inactive设置的。

    连接是数据库最宝贵的资源,我们尽量用保守的策略去处理连接。所以60s没有活跃的,可以去掉重建了。

    实际上,我们有时候也会用phyTimeoutMillis和phyMaxUseCount控制一定时间或使用次数强制回收连接,以保证所有连接的可用性,以及数据库的内存有机会回收。

    原回答者GitHub用户kimmking

    2023-07-06 10:37:28
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载