我们有一个连接到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
答案 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