1.问题描述 应用druid连接池,长时间没有请求造成的数据库连接超时,抛出异常: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2.尝试方法 期望通过testWhileIdle = true 结合validationQuery每隔30s更新连接的状态,但结果是不会30s执行select 'x'语句(通过日志和stat监控中sql得到)。
<property name="validationQuery" value="SELECT 'x'" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="numTestsPerEvictionRun" value="3" />
<property name="minEvictableIdleTimeMillis" value="600000" />
3其他方案 已在DBCP连接池测试,testWhileIdle=true是奏效的。
原提问者GitHub用户qiuyinglanshan
使用Druid连接池时,如果长时间没有请求,可能会导致连接超时或失效。为了避免这个问题,可以使用Druid连接池提供的心跳检测功能,定期检查连接的状态,并尝试重新连接。以下是一些可能有用的解决方案:
配置testWhileIdle和validationQuery:可以在Druid连接池的配置文件中,将testWhileIdle设置为true,并指定validationQuery为一个有效的SQL语句,以检查连接是否有效。例如:
Copy
validationQuery=select 'x'
testWhileIdle=true
这样,Druid连接池将会每隔一段时间(默认是timeBetweenEvictionRunsMillis,即30秒)执行一次validationQuery,如果连接状态异常,则会关闭连接,并尝试重新连接。
配置timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis:可以在Druid连接池的配置文件中,将timeBetweenEvictionRunsMillis设置为一个较小的值(如5秒),并将minEvictableIdleTimeMillis设置为一个较大的值(如10分钟),以确保连接定期被检查并重建。例如:
Copy
timeBetweenEvictionRunsMillis=5000
minEvictableIdleTimeMillis=600000
这样,Druid连接池将会每隔5秒执行一次连接检查,如果连接空闲时间超过10分钟,则会关闭连接,并尝试重新连接。
通常是申请连接后长时间不使用导致的。比如: Connection conn = ...; ... // 长时间操作,比如30分钟 Statement stmt = conn.createStatement(); stmt.executeQuery("select ...");
原回答者GitHub用户wenshao
根据您提供的信息,您正在使用Druid连接池,并且希望通过设置testWhileIdle=true
和validationQuery
来解决长时间无请求导致的数据库连接超时问题。然而,您发现在Druid连接池中这种配置方式并不奏效,而在DBCP连接池中是有效的。
首先,确保您已经正确配置了Druid连接池,并在应用程序中使用了正确的连接池配置。您可以检查以下几点:
确保您已经正确配置了Druid的数据源,并且应用程序正在使用该数据源。您可以检查您的代码,确保正确地获取和释放数据库连接,并且使用的是Druid数据源提供的连接。
确保您设置了正确的validationQuery
。您可以在Druid数据源配置中指定一个有效的SQL语句作为validationQuery
,以验证连接的可用性。例如,您可以使用以下配置:
<property name="validationQuery" value="SELECT 1" />
确保您设置了testWhileIdle=true
。这将启用连接池的空闲连接验证功能,以确保连接在空闲时仍然可用。
如果您已经按照上述步骤进行了配置,但仍然无法解决问题,您可以尝试以下几点:
检查您的数据库服务器日志,查看是否有关于连接超时或通信链路故障的错误信息。这可能有助于确定问题的根本原因。
在Druid连接池的配置中,您可以尝试调整timeBetweenEvictionRunsMillis
和numTestsPerEvictionRun
参数的值,以确保连接验证任务能够按预期执行。
您还可以尝试升级Druid的版本,以获取可能修复了连接验证问题的最新版本。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。