Hibernate c3p0连接池没有超时空闲连接

时间:2009-09-03 18:19:57

标签: database hibernate database-connection connection-pooling c3p0

我们有一个连接到MySQL 5数据库的java服务器,使用Hibernate作为我们的持久层,它使用c3p0进行数据库连接池。

我尝试过关注c3p0和hibernate文档:

我们的生产服务器上出现错误,说明:

  

...引起:   com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:   连接后不允许任何操作   closed.Connection是隐含的   由于潜在的关闭   异常/错误:

     

开始嵌入异常

     

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

     

消息:最后一个数据包成功   从服务器收到的是45000   秒发生。最后一个包发送   成功到服务器是45000   几秒钟前,这比   服务器配置的值   'WAIT_TIMEOUT'。你应该考虑一下   要么到期和/或测试   在你的使用之前连接有效性   应用程序,增加服务器   配置的客户端超时值,   或使用Connector / J连接   属性'autoReconnect = true'以避免   这个问题。

     

堆栈跟踪:

     

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:   成功收到最后一个数据包   从服务器是45000秒   previous。最后一个包成功发送   到服务器是45000秒前,   这比服务器长   配置的'wait_timeout'值。   你应该考虑到期   和/或测试连接有效性   在您的申请中使用之前,   增加配置的服务器   客户端超时或使用的值   Connector / J连接属性   'autoReconnect = true'以避免这种情况   问题

我们的c3p0连接池属性设置如下:

hibernate.c3p0.max_size=10
hibernate.c3p0.min_size=1
hibernate.c3p0.timeout=5000
hibernate.c3p0.idle_test_period=300
hibernate.c3p0.max_statements=100
hibernate.c3p0.acquire_increment=2

default MySQL wait_timetout设置为28800秒(8小时),报告的错误表示已超过45000秒(约12.5小时)。虽然c3p0配置声明它将“超时”5000秒后未使用的空闲连接,并且它将每隔300秒检查一次,因此空闲连接的寿命不应超过5299秒吗?

我已经通过设置我的开发人员MySQL(Windows上的my.ini,Unix上的my.cnf)wait_timeout = 60并将c3p0空闲超时值降低到60秒以下进行本地测试,并且它将正确地超时空闲连接并创建新的那些。我还检查以确保我们没有泄漏数据库连接并保持连接,并且它看起来不是我们的。

这是我在开发人员环境中用来测试的c3p0.properties文件,以确保c3p0正确处理连接。

hibernate.properties(使用MySQL wait_timeout = 60进行测试)

hibernate.c3p0.max_size=10
hibernate.c3p0.min_size=1
hibernate.c3p0.timeout=20
hibernate.c3p0.max_statements=100
hibernate.c3p0.idle_test_period=5
hibernate.c3p0.acquire_increment=2

c3p0.properties

com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=ALL
com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog
c3p0.debugUnreturnedConnectionStackTraces=true
c3p0.unreturnedConnectionTimeout=10

1 个答案:

答案 0 :(得分:2)

通过检查日志确保c3p0真正开始。我出于某种原因,在我的类路径上有两个版本的hibernate(hibernate-core3.3.1.jar和hibernate-3.2.6GA.jar)。我还使用了与3.2.x不兼容的hibernate annotatations版本3.4.0GA。 (不知道这是否与原始问题有关)。 删除其中一个hibernate jar之后(不记得我删除了哪个,可能是hibernate-3.2.6GA.jar)c3p0终于开始了,我摆脱了8小时不活动后发生的烦人的com.mysql.jdbc.exceptions.jdbc4.CommunicationsException