【问题标题】:jdbc4 CommunicationsExceptionjdbc4 通信异常
【发布时间】:2010-11-12 05:37:20
【问题描述】:

我有一台运行 java 应用程序的机器与在同一实例上运行的 mysql 实例通信。应用程序 使用来自 mysql 的 jdbc4 驱动程序。我不断收到 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException 在随机时间。

这是整个信息。

无法为事务打开 JDBC 连接;嵌套异常是

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was25899 milliseconds ago.The last packet sent successfully to the server was 25899 milliseconds ago, which  is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

对于 mysql,全局“wait_timeout”和“interactive_timeout”的值设置为 3600 秒,“connect_timeout”设置为 60 秒。等待超时值远高于 26 秒(25899 毫秒)。在异常跟踪中提到。

我使用 dbcp 进行连接池,这里是数据源的 spring bean 配置。

   <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource" >
          <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/db"/>
                <property name="username" value="xxx"/>
                <property name="password" value="xxx" />
                    <property name="poolPreparedStatements" value="false" />
            <property name="maxActive" value="3" />
            <property name="maxIdle" value="3" />
    </bean>

知道为什么会发生这种情况吗?使用 c3p0 会解决问题吗?

【问题讨论】:

    标签: java mysql jdbc timeout connection


    【解决方案1】:

    我会遵循例外中的建议。您应该考虑:

    1. 在您的应用程序中使用之前过期和/或测试连接有效性,
    2. 增加客户端超时的服务器配置值,或
    3. 使用 Connector/J 连接属性“autoReconnect=true”来避免此问题。尝试将其添加到您的连接 URL(请参阅文档以获取确切的语法)并查看它是否有帮助。

    我怀疑 C3P0 会比您已经在使用的 DBCP 好得多。例外是给你一些具体的建议。你已经尝试了#3。另外两个呢?

    我知道如何让 WebLogic 在使用连接之前检查它们。您应该了解如何对 Tomcat 执行相同的操作。

    【讨论】:

    • 试过了,现在得到“无法为事务打开 JDBC 连接;嵌套异常是 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure”
    【解决方案2】:

    您能否描述一下您的应用如何处理连接池?我怀疑 JDBC 驱动程序中的 autoReconnect=true 会重新池化来自您的应用程序的连接。应用在失去连接时需要重新连接。

    【讨论】:

      【解决方案3】:

      我之前看到已经移到网络上的 Windows 机器无法连接到自己。

      在 JVM 之外是否存在任何连接问题 - 即 mysql 客户端连接到服务器、超时等?

      【讨论】:

        【解决方案4】:

        尝试正确设置 Apache Commons DBCP。

        你需要设置:

        • 验证查询到 SELECT 1+1
        • testOnBorrow 为真

        这应该可以解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-11
          • 2011-10-17
          • 1970-01-01
          • 2011-06-27
          • 1970-01-01
          • 1970-01-01
          • 2018-01-24
          相关资源
          最近更新 更多