0

我正在使用 C3P0 连接池。我添加了一个扩展 C3P0ConnectionProvider 的类 TestConnectionProvider。我想要的是捕获异常后,Hibernate 仍应尝试重新连接。但是,在捕获异常后,应用程序将停止。

顺序如下 1) MySQL 连接停止 2) Hibernate 尝试重新连接多次。3)我开始MySQL连接。4) Hibernate 获得连接并开始插入数据。5)我再次停止了连接。6) 现在 Hibernate 抛出我的应用程序没有捕获的异常。

我想要实现的是每当 Hibernate 失去连接时,它应该由应用程序的异常处理机制处理,并且仍然尝试重新连接,无论连接在启动时还是在两者之间不可用。

4

1 回答 1

1

我假设您不是指在执行长时间运行的 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 参数testConnectionOnCheckoutidleConnectionTestPeriod. 有关它们的更多信息,请点击此处这个帖子也有关系。

如果您正确关闭 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 控制台中使用(有关更多信息,请参见此处信息)。

如果进程列表不断增长,则说明您没有正确释放连接,并且地球上没有连接池可以拯救您。

于 2013-01-17T01:59:03.003 回答