我有一台运行 Java 应用程序的机器,该应用程序与在同一实例上运行的 mysql 实例通信。该应用程序使用来自 mysql 的 jdbc4 驱动程序。我不断随机收到 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException。
以下是完整消息。
无法打开 JDBC 连接进行事务;嵌套异常为 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收的最后一个数据包是 25899 毫秒前。成功发送到服务器的最后一个数据包是 25899 毫秒前,比服务器配置的“wait_timeout”值更长。您应该考虑在应用程序中使用之前使连接过期和/或测试连接有效性,增加服务器配置的客户端超时值,或使用 Connector/J 连接属性“autoReconnect=true”来避免此问题。
对于 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 可以解决问题吗?
答案1
我昨天才发现,使用 mysql .NET 连接器时,需要 25 秒或更长时间的查询会超时。也许 JDBC 驱动程序中存在类似的东西,也许可以使用 socketTimeout 属性(即使文档说默认没有超时)。