开发者社区> 问答> 正文

偶发连接失效java.sql.SQLException: connection disabled

访问mysql过程中会突然出现

异常日志一: DruidPooledStatement errorCheck:CommunicationsException,druid version 1.1.23 然后报出异常日志二: discard connection com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 5,538,582 milliseconds ago. The last packet sent successfully to the server was 5,538,582 milliseconds ago. …… Caused by: java.net.SocketException: Connection reset at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115)

后续有请求还偶尔报出 Cause: java.sql.SQLException: connection disabled ; uncategorized SQLException; SQL state [null]; error code [0]; connection disabled; nested exception is java.sql.SQLException: connection disabled at …… Caused by: java.sql.SQLException: connection disabled at com.alibaba.druid.pool.DruidPooledConnection.checkStateInternal(DruidPooledConnection.java:1169) at …… Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 5,538,582 milliseconds ago. The last packet sent successfully to the server was 5,538,582 milliseconds ago. …… Caused by: java.net.SocketException: Connection reset at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115) at ……

配置: spring: datasource: druid: max-active: 10 min-idle: 0 max-wait: 5000 validation-query: select 1 testOn-borrow: true

... received from the server was 5,538,582 milliseconds ago. 为什么不同时间点报错的5,538,582 这个数值是不变的,mysql服务端的空闲超时时间是24小时。个人理解min-idle设置为0后,那么所有的连接在空闲30min应该都被清除的,而5,538,582是否表示该连接空闲已经超过30min

原提问者GitHub用户cdming405003

展开
收起
山海行 2023-07-05 16:09:41 3612 0
5 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    以下是一些可能导致这个错误的常见原因和解决方法:

    数据库连接池配置问题:如果您使用连接池管理数据库连接,可能是连接池配置存在问题,例如连接池没有足够的空闲连接、连接池大小设置不合适等,导致数据库连接被占用完毕或者连接超时。您可以检查连接池配置,包括连接池大小、最大连接数、连接超时时间等,以确保连接设置正确。

    数据库故障或网络故障:如果数据库或网络出现故障,连接可能会被禁用或关闭。您可以检查数据库和网络的状态,包括检查数据库是否正常运行、网络连接是否稳定等。

    数据库访问权限问题:如果您使用的数据库账号没有足够的权限访问数据库,连接可能会被禁用或关闭。您可以检查数据库账号的权限设置,包括授权对象、授权范围等。

    数据库连接超时或空闲太久:如果连接空闲时间过长,或者连接超时时间设置过短,可能导致连接被禁用或关闭。您可以检查连接超时时间设置,以及连接池的空闲连接回收策略等,确保连接不会被过早地关闭。

    数据库版本不兼容:如果您使用的数据库版本与 JDBC 驱动程序版本不兼容,也可能导致这个错误。您可以检查 JDBC 驱动程序的版本和数据库的版本,以确保它们兼容。

    2023-07-30 21:49:37
    赞同 展开评论 打赏
  • 检查网络连接:确保数据库服务器与应用程序服务器之间的网络连接稳定,没有丢包或其他网络问题。

    检查服务器配置:检查 MySQL 服务器的配置,确保空闲连接的超时时间设置正确,并且与应用程序的连接池配置保持一致。

    调整连接池配置:可以尝试调整连接池的相关配置,例如增加 min-idle 值,以便保留一定数量的空闲连接,避免频繁创建和关闭连接。

    升级驱动程序:如果您使用的是较旧的 MySQL 驱动程序版本,尝试升级到最新的稳定版本,以获取更好的兼容性和性能。

    2023-07-09 10:02:23
    赞同 展开评论 打赏
  • 建议你们先升一下druid版本,新版本修复了很多issue。

    你们应该检查一下应用和数据库之间的网络设备配置,这种30分钟就断开连接的现象多是防火墙自动reset了空闲tcp连接超过30分钟导致的,要保活druid需要设置keepAlive=true

    原回答者GitHub用户zrlw

    2023-07-06 10:35:23
    赞同 展开评论 打赏
  • 根据你提供的日志和配置,可以做出以下解释:

    1. 异常日志一中的 "CommunicationsException" 和异常日志二中的 "Communications link failure" 表明在与 MySQL 数据库服务器之间通信时发生了问题。这可能是由于网络中断、连接超时或数据库服务器故障等原因导致。

    2. 异常日志中提到的 "The last packet successfully received from the server was 5,538,582 milliseconds ago" 是指最后一个成功从服务器接收到的数据包距离当前时间已经过去了5538582毫秒(约92分钟)。

    3. 该数值固定不变可能是由于每次报错时记录的时间都恰好相同。这并不意味着连接空闲超过30分钟,而是表示在上一次成功接收或发送数据包后的时间间隔。

    4. 配置中的 min-idle: 0 表示连接池中的最小空闲连接数为0,这意味着即使连接处于空闲状态,也不会保留任何空闲连接。连接在空闲30分钟后是否被清除取决于连接池的其他设置,如 timeBetweenEvictionRunsMillisminEvictableIdleTimeMillis。你可以检查这些配置参数以确保连接在适当的时间内被清除。

    针对这个问题,可以尝试以下解决方法:

    1. 检查网络连接和稳定性,确保数据库服务器和应用程序之间的网络通信正常。可以尝试通过其他方式测试与数据库服务器的连接,并检查网络是否存在问题。

    2. 确认 MySQL 数据库服务器的状态和配置。检查数据库服务器日志以查看是否有任何关于连接中断或故障的错误信息。确保服务器设置的空闲超时时间与你的期望一致。

    3. 调整连接池的配置参数,如 timeBetweenEvictionRunsMillisminEvictableIdleTimeMillis,以确保连接在适当的时间内被清除。

    4. 尝试升级 Druid 连接池版本到最新的稳定版本,以确保使用最新的 bug 修复和增强功能。

    如果问题仍然存在,建议咨询数据库管理员或阿里云技术支持团队以获得更具体的帮助和支持。他们将能够协助诊断并解决此连接问题。

    2023-07-05 17:47:48
    赞同 展开评论 打赏
  • 根据您提供的错误日志,报错信息为 "CommunicationsException" 和 "Connection reset",这通常表示在与数据库服务器进行通信时发生了连接问题。

    在您的配置中,max-wait 设置为 5000,这意味着连接池在获取连接时最多等待 5000 毫秒。但是,根据错误日志中显示的时间戳(5,538,582 毫秒),连接断开的时间已经超过了这个等待时间。这可能是由于数据库服务器或网络故障导致的。

    关于 "min-idle" 的问题,您的理解是正确的。将 min-idle 设置为 0 可以确保连接池在空闲一段时间后关闭空闲连接。但是,根据您提供的错误日志中的时间戳,5,538,582 毫秒远远超过了空闲 30 分钟的时间。因此,这个时间戳不是表示连接空闲时间的值。

    出现这种连接失效的情况可能是由于以下原因导致的:

    1. 数据库服务器配置问题:请确保数据库服务器的配置正确无误,并且能够处理足够的并发连接。检查数据库服务器的日志文件以获取更多详细的错误信息。

    2. 网络问题:可能存在网络故障或不稳定的情况,导致与数据库服务器的连接断开。您可以尝试使用 ping 命令或其他网络诊断工具来测试与数据库服务器的网络连接质量。

    3. 防火墙或网络设备问题:请确保防火墙或其他网络设备没有阻止与数据库服务器的通信。检查网络设备的配置,确保数据库服务器的端口是可访问的。

    4. 数据库连接池配置问题:您可以尝试调整连接池的配置参数,例如增加 max-active 的值来适应更多的并发连接需求。您还可以尝试调整连接的超时时间,以适应网络连接的稳定性。

    2023-07-05 16:53:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载