重新连接到休眠的问题

时间:2013-01-16 14:08:37

标签: hibernate

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

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

我想要实现的是每当Hibernate失去连接时,它应该由应用程序的异常处理机制处理,并且仍然尝试重新连接连接是否在开始时或之间不可用。

1 个答案:

答案 0 :(得分:0)

我假设你没有提到在执行长时间运行的Hibernate事务时发生的错误。

如果是,解决方案与您的连接池没有直接关系。您需要捕获异常(确切地说您可以说,但可能在您启动事务的级别),回滚事务并继续尝试直到您成功(即启动新事务)。您提到连接池这一事实似乎向我表明您的c3p0重新连接设置存在问题。

这是我的hibernate连接参数(来自.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。有关他们的更多信息hereThis post也是相关的。

如果您正在正确关闭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会话后,还要检查是否正确关闭了Hibernate会话。您可以使用“性能”测试来检查这一点,该测试一次打开许多hibernate会话(如果您正在构建Web应用程序,可能会一次发送许多HTTP请求),并在MySQL控制台中使用show processlist (有关详细信息,请参阅here)。

如果进程列表不断增长,则表示您没有正确释放连接,并且地球上没有连接池可以为您节省成本。