开发者社区> 问答> 正文

通信链路故障问题

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

展开
收起
山海行 2023-07-05 22:04:00 88 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    使用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分钟,则会关闭连接,并尝试重新连接。

    2023-07-29 23:14:56
    赞同 展开评论 打赏
  • 通常是申请连接后长时间不使用导致的。比如: Connection conn = ...; ... // 长时间操作,比如30分钟 Statement stmt = conn.createStatement(); stmt.executeQuery("select ...");

    原回答者GitHub用户wenshao

    2023-07-06 12:58:41
    赞同 展开评论 打赏
  • 根据您提供的信息,您正在使用Druid连接池,并且希望通过设置testWhileIdle=truevalidationQuery来解决长时间无请求导致的数据库连接超时问题。然而,您发现在Druid连接池中这种配置方式并不奏效,而在DBCP连接池中是有效的。

    首先,确保您已经正确配置了Druid连接池,并在应用程序中使用了正确的连接池配置。您可以检查以下几点:

    1. 确保您已经正确配置了Druid的数据源,并且应用程序正在使用该数据源。您可以检查您的代码,确保正确地获取和释放数据库连接,并且使用的是Druid数据源提供的连接。

    2. 确保您设置了正确的validationQuery。您可以在Druid数据源配置中指定一个有效的SQL语句作为validationQuery,以验证连接的可用性。例如,您可以使用以下配置:

      <property name="validationQuery" value="SELECT 1" />
      
    3. 确保您设置了testWhileIdle=true。这将启用连接池的空闲连接验证功能,以确保连接在空闲时仍然可用。

    如果您已经按照上述步骤进行了配置,但仍然无法解决问题,您可以尝试以下几点:

    1. 检查您的数据库服务器日志,查看是否有关于连接超时或通信链路故障的错误信息。这可能有助于确定问题的根本原因。

    2. 在Druid连接池的配置中,您可以尝试调整timeBetweenEvictionRunsMillisnumTestsPerEvictionRun参数的值,以确保连接验证任务能够按预期执行。

    3. 您还可以尝试升级Druid的版本,以获取可能修复了连接验证问题的最新版本。

    2023-07-06 08:51:48
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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