我们有一个 java 服务器连接到 MySQL 5 数据库,使用 Hibernate 作为持久层,该持久层使用 c3p0 进行数据库连接池。
我尝试遵循 c3p0 和 hibernate 文档:
- Hibernate - 如何配置 c3p0 连接池 https://www.hibernate.org/214.html
-
C3P0 Hibernate properties http://www.mchange.com/projects/c3p0/index.html#hibernate-specific
- C3P0.properties配置 http://www.mchange.com/projects/c3p0/index.html#configuration_properties
我们的生产服务器上收到一个错误,指出:
...造成的原因:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
连接后不允许进行任何操作
已关闭。连接是隐式的
由于底层原因而关闭
异常/错误:
开始嵌套异常
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
MESSAGE:最后一个数据包成功
从服务器收到的是45000
几秒钟前发送的最后一个数据包
成功到服务器是45000
几秒前,比
服务器配置的值
'等待超时'。你应该考虑
即将到期和/或正在测试
在您使用之前的连接有效性
应用程序,增加服务器
客户端超时的配置值,
或使用连接器/J 连接
避免使用属性“autoReconnect=true”
这个问题。
堆栈跟踪:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
最后一个数据包成功接收
来自服务器的时间为 45000 秒
前.最后一个数据包发送成功
到服务器的时间是 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
The 默认 MySQL wait_timeout http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout设置为 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.属性
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