Spring “如何修复”;C3P0:已发出连接错误信号的PooledConnection仍在使用中;

Spring “如何修复”;C3P0:已发出连接错误信号的PooledConnection仍在使用中;,spring,hibernate,c3p0,Spring,Hibernate,C3p0,我们有一个web应用程序,它有StackSpring、Hibernate、C3P0、OracleDB驱动程序(后面有一个OracleDB)。 有时,我们会经历较长时间的阻塞锁,然后在DB端被杀死。(我们知道这是由糟糕的应用程序设计造成的,我们会解决它,但这不是这个问题的重点)。 DB会话被DB终止后,连接池似乎重新使用了现在已断开的连接,从而导致错误: A PooledConnection that has already signalled a Connection error is sti

我们有一个web应用程序,它有StackSpring、Hibernate、C3P0、OracleDB驱动程序(后面有一个OracleDB)。 有时,我们会经历较长时间的阻塞锁,然后在DB端被杀死。(我们知道这是由糟糕的应用程序设计造成的,我们会解决它,但这不是这个问题的重点)。 DB会话被DB终止后,连接池似乎重新使用了现在已断开的连接,从而导致错误:


A PooledConnection that has already signalled a Connection error is still in use!
Another error has occurred [ java.sql.SQLRecoverableException: Closed Connection ] which will not be reported to listeners!
在我们配置的数据源上

dataSource.setTestConnectionOnCheckin(true);
dataSource.setTestConnectionOnCheckout(true);
但这没有帮助。我们期望连接通过这些测试,然后得到更新。但事实并非如此


有没有提示我们如何重新创建断开的连接?

当已签出的
连接遇到
异常时,会发出此警告,该异常会导致c3p0将其视为无效(因此它不会在
关闭()
时重新合并回池中),但是,
连接
继续使用,并且再次遇到异常。这些不是池中断开的连接。它们在应用程序使用时断开连接。所以在签出(或签入)时测试它们对它们没有任何作用

要解决这个问题,您需要检查应用程序代码中的异常处理。是否存在以下情况:无效的
连接
可能引发了
异常
,但该
异常
被捕获并重新使用了
连接


警告本身是无害的。只是说c3p0已经知道
连接是坏的,它不会再次发出事件来发出信号。

当我们使用Hibernate创建和执行任何SQL语句时,Hibernate是否有责任正确处理异常?也许吧!有很多方法可以使用和滥用hibernate。在上面引用的位之后,应该记录异常堆栈跟踪。您可能希望检查该堆栈跟踪中的代码路径,并考虑在发生先前的异常后如何到达该路径。此警告的后果是什么?我的意思是:当然,这意味着某些操作已关闭,但它是否告诉我们,例如,至少您尝试执行的某些操作已回滚,因为在这样的连接上完成了?或者可能是所有的交易都进行得很顺利,只是说你应该更仔细地跟踪这些联系?顺便说一句:我得到这个警告,即使我从来没有直接访问连接,只有通过hibernate的entitymanager。这可能是旧hibernate版本中的错误吗?