如何解决“C3P0:已经发出连接错误信号的PooledConnection仍在使用中”

时间:2018-04-27 16:11:43

标签: spring hibernate c3p0

我们有一个带有堆栈Spring,Hibernate,C3P0,Oracle数据库驱动程序的Web应用程序(背后是Oracle数据库)。 我们不时会遇到阻塞锁定较长时间,然后在数据库端被杀死。 (我们知道这是由糟糕的应用程序设计引起的,我们将修复它,但这不是问题的重点)。 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上

dataSource.setTestConnectionOnCheckin(true);
dataSource.setTestConnectionOnCheckout(true);

但它没有帮助。我们期望连接失败,然后更新。但这不会发生。

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

1 个答案:

答案 0 :(得分:0)

已经检出Connection遇到导致c3p0将其视为无效的Exception时,会发出此警告(因此不会将其重新纳入close()上的池,但Connection继续使用并再次遇到异常。这些不是池中的连接断开。应用程序正在使用它们Connection。因此,在结账时(或签到)对它们进行测试并没有对它们做任何事情。

要摆脱这种情况,您需要检查应用程序代码中的异常处理。是否存在无效Connection可能引发Exception但是Exception被抓住且Connection重复使用的情况?

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