与重新连接到hibernate有关的问题

与重新连接到hibernate有关的问题,hibernate,Hibernate,我正在使用C3P0连接池。我添加了一个类TestConnectionProvider,它扩展了C3P0ConnectionProvider。我想要的是,在捕捉到异常之后,Hibernate仍然应该尝试重新连接。但是,捕获异常后,应用程序将停止 顺序如下:1)MySQL连接停止2)Hibernate多次尝试重新连接。3) 我启动MySQL连接。4) Hibernate获得连接并开始插入数据。5) 我再次中断了连接。6) 现在Hibernate抛出应用程序未捕获的异常 我想要实现的是,每当Hiber

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

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


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

我假设您不是指在执行长时间运行时发生的错误休眠事务

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

以下是我的hibernate连接参数(来自.properties文件,您的可能是xml格式的)

注意c3p0参数
testConnectionOnCheckout
idleConnectionTestPeriod
。更多关于它们的信息。这也是相关的

如果您正确关闭Hibernate会话(从而将连接释放回连接池),这些设置将允许您在应用程序运行时处理丢失的数据库连接

如果在中添加这些配置设置后,数据库连接仍然没有恢复能力,请在日志中进行双重检查,以确保您实际上正在初始化c3p0池。您应该看到这一点(在设置
log4j.logger.com.mchange.v2=INFO
之后)

信息2013-01-17 11:14:18832[main]com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource:正在初始化c3p0池

此外,还要检查在完成休眠会话后是否正确关闭了它们。您可以通过使用一个“性能”测试来检查这一点,该测试一次打开多个hibernate会话(如果您正在构建web应用程序,可以通过一次发送多个HTTP请求),并在MySQL控制台中使用
show processlist
(有关更多信息,请参阅)

如果进程列表不断增加,那么您没有正确地释放连接,地球上没有任何连接池可以拯救您

...
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
...