【发布时间】:2010-12-03 11:14:28
【问题描述】:
我从生产代码中得到了这个错误:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 最后一个数据包成功接收 从服务器是36940秒 ago.最后一个包发送成功 到服务器是 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 秒。我应该使用什么值才能正确验证空闲连接?
所以我基本上要问两件事:
- 如何重现生产代码中出现的错误?
- 我该如何解决?
谢谢!
【问题讨论】:
-
您最初的生产错误是指超过 10 小时的时间段,并且是在早上首次使用系统时签出连接时发生的?您不能将最小池大小设置为 0 或通过 JXB 公开池并在工作日开始之前刷新它吗?
-
@fei - 你解决了吗?有兴趣知道结果是什么。
-
我最终使用了以下 2 个属性: testConnectionOnCheckout="true" preferredTestQuery="select 1" 不是最佳解决方案,但至少可以解决问题。
标签: mysql hibernate spring jdbc c3p0