通信链路故障。连接复位

时间:2012-09-28 06:48:56

标签: java mysql hibernate c3p0

我的应用程序在使用Hibernate与MySQL数据库交谈时偶尔会看到此异常。我尝试调整C3p0属性,但它似乎不起作用。

以下是与C3p0相关的设置:

<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.idle_test_period">60</property><!-- in seconds -->
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.timeout">180</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1</property>

连接网址如下所示:

jdbc:mysql://<DB endpoint>?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&requireSSL=true&verifyServerCertificate=false

Stacktrace是:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 1549998 ms ago.

Caused by: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: java.net.SocketException: 
Connection reset

我是否需要调整MySQL系统变量?任何指针如何避免这种异常?

由于 Jitendra

2 个答案:

答案 0 :(得分:3)

听起来你在游泳池中有一些连接,只使用其中的一部分。其中一些只是等待使用,并且变得陈旧(连接因某种原因被重置 - 例如DB侧的一些超时)。然后,当你在某个时刻尝试使用它们时,你会得到例外。

通常有一些选项可以解决此问题,例如,您可以在从池中检索连接之前测试连接(hibernate.c3p0.testConnectionOnCheckout)

您还可以定期检查池中连接的状态和/或检查checkIn上的连接。见http://www.mchange.com/projects/c3p0/#configuring_connection_testing

如果没有帮助 - 整个堆栈跟踪可能会有用。

答案 1 :(得分:3)

hibernate.c3p0.idle_test_period - 或c3p0.idleConnectionTestPeriod仅在连接空闲60秒时每60秒测试一次。如果您的应用程序非常活跃,它将不会闲置这么久。 c3p0尝试注意应用程序收到的异常意味着Connection应该无效,但这取决于Exception的SQLState,它在数据库/ JDBC驱动程序之间不一致,并且不完全可靠。死亡的连接很少能在多轮签到/结账时存活,但在您的设置下可能会发生。

最简单的解决方案是将c3p0.testConnectionOnCheckin添加到您的配置中。无论Connections是忙还是空闲,都可以确保在允许连接到池之前测试Connections,而不会在结账时产生测试的同步开销。

请查看http://www.mchange.com/projects/c3p0/#configuring_connection_testing

还请验证您正在设置的配置参数是否正在通过基础连接池。 c3p0将其配置转储到池初始化为INFO级别的日志:检查日志以验证您的设置是否符合您的预期。 (或者,您可以在应用程序通过jmx运行时检查您的池。)

祝你好运!

相关问题