druid version: 1.2.15
此处的校验空闲链接时长是不是应该取 minEvictableIdleTimeMillis 而不是 timeBetweenEvictionRunsMillis
原提问者GitHub用户ylq5126
Druid 数据库连接池中的 testConnectionInternal() 方法主要用于测试连接是否可用。在该方法中,会创建一个新的连接,并通过执行 SELECT 1 等测试语句,来检查连接是否正常工作。如果测试成功,则表示连接可用,否则会抛出异常。
如果您在使用 testConnectionInternal() 方法时出现了问题,可能是由于一些原因导致连接测试失败。以下是一些可能导致连接测试失败的原因和解决方法:
数据库用户权限不足:如果连接池使用的数据库用户没有足够的权限执行 SELECT 1 等测试语句,则会导致连接测试失败。解决方法是,检查数据库用户权限,并授予必要的权限。
数据库服务问题:如果数据库服务出现了故障或网络问题,则可能导致连接测试失败。解决方法是,检查数据库服务状态,并进行必要的修复和调整。
连接池配置不合理:如果连接池配置不合理,可能会导致连接测试失败。例如,如果最大连接数设置过小,则可能会无法获取可用连接。解决方法是,检查连接池配置,并根据实际情况进行调整。
数据库驱动版本不兼容:Druid 数据库连接池需要与数据库驱动版本兼容,否则可能会导致连接测试失败或连接池无法正常工作。解决方法是,检查您使用的数据库驱动版本是否与 Druid 数据库连接池兼容,并尝试升级或降级数据库驱动版本。
先说结论,这里没问题。
timeBetweenEvictionRunsMillis 是 60s minEvictableIdleTimeMillis 是 半小时 maxEvictableIdleTimeMillis 是7小时
常规情况下,判断的idle是 60s(比如testWhileIdle也是这个值)。 minEvictableIdleTimeMillis过长,现在很多云环境,默认idle 15分钟的tcp连接会被SLB干掉。 7小时明显是为了mysql默认的那个8小时inactive设置的。
连接是数据库最宝贵的资源,我们尽量用保守的策略去处理连接。所以60s没有活跃的,可以去掉重建了。
实际上,我们有时候也会用phyTimeoutMillis和phyMaxUseCount控制一定时间或使用次数强制回收连接,以保证所有连接的可用性,以及数据库的内存有机会回收。
原回答者GitHub用户kimmking
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。