我假设您不是指在执行长时间运行的 Hibernate 事务时发生的错误。
如果是,则该解决方案与您的连接池没有直接关系。您需要捕获异常(确切地说是在哪里,但也许在您开始事务的级别),回滚事务并继续尝试直到成功(即开始新事务)。您提到您的连接池这一事实似乎向我表明您的 c3p0 重新连接设置存在问题。
这是我的休眠连接参数(来自 .properties 文件,您的可能在 xml 中)...
...
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost/db
hibernate.connection.username=user
hibernate.connection.password=password
hibernate.connection.provider_class=org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
hibernate.c3p0.minPoolSize=3
hibernate.c3p0.maxPoolSize=200
hibernate.c3p0.maxStatements=100
hibernate.c3p0.testConnectionOnCheckout=true
hibernate.c3p0.idleConnectionTestPeriod=300
...
注意 c3p0 参数testConnectionOnCheckout
和idleConnectionTestPeriod
. 有关它们的更多信息,请点击此处。这个帖子也有关系。
如果您正确关闭 Hibernate 会话(从而将连接释放回连接池),这些设置将允许您在应用程序运行时处理丢失的数据库连接。
如果在添加这些配置设置后数据库连接仍然没有弹性,请仔细检查日志以确保您实际上正在初始化 c3p0 池。你应该看到这个(在你设置之后log4j.logger.com.mchange.v2=INFO
)......
INFO 2013-01-17 11:14:18,832 [main] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource:正在初始化 c3p0 池...
完成后,还要检查您是否正确关闭了 Hibernate 会话。您可以通过使用“性能”测试来检查这一点,该测试一次打开多个休眠会话(如果您正在构建 Web 应用程序,可能一次发送多个 HTTP 请求),并结合show processlist
在 MySQL 控制台中使用(有关更多信息,请参见此处信息)。
如果进程列表不断增长,则说明您没有正确释放连接,并且地球上没有连接池可以拯救您。