我从生产代码中得到了这个错误:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收的最后一个数据包是36940秒前。最后一个成功发送到服务器的数据包是36940秒前,比服务器配置的'wait_timeout'值长。您应该考虑在应用程序中使用之前使连接有效性过期和/或测试,增加客户端超时的服务器配置值,或使用 Connector/J 连接属性“autoReconnect=true”来避免此问题。
现在我正在尝试在本地重现问题并修复它。我将弹簧上下文设置如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost:3306/test?useUnicode=yes&characterEncoding=UTF-8&"
p:idleConnectionTestPeriod="120" p:initialPoolSize="1" p:maxIdleTime="1800"
p:maxPoolSize="1" p:minPoolSize="1" p:checkoutTimeout="1000"
/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<value>
hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.default_schema=platform_server_original
hibernate.show_sql=false
</value>
</property>
<property name="mappingResources">
<list>
<value>sometables.hbm.xml</value>
</list>
</property>
</bean>
然后我将我的mysql wait_timeout设置为10秒,然后运行我的测试,基本上是打开一个连接,做一个查询,关闭它,所以它返回到池中,然后让线程休眠15秒,然后再次打开一个连接,然后再次查询,所以它会中断。但是,我只收到了类似的错误:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
发送到服务器的最后一个数据包是 16 毫秒前。
所以我想知道这两个错误是相同的,还是不同的?我做了一些研究,似乎这两个错误都归结为同一个解决方案:使用属性“testConnectionOnCheckout = true”。但是,根据 c3p0 文档,这是一项非常昂贵的检查。它建议使用“idleConnectionTestPeriod”,但我已经将其设置为 120 秒。我应该使用什么值才能正确验证空闲连接?
所以我基本上要问两件事:
- 如何重现我在生产代码中遇到的错误?
- 我如何解决它?
谢谢!