我们有一个带有堆栈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);
但它没有帮助。我们期望连接失败,然后更新。但这不会发生。
我们如何重新创建断开连接的任何提示?
答案 0 :(得分:0)
当已经检出的Connection
遇到导致c3p0将其视为无效的Exception
时,会发出此警告(因此不会将其重新纳入close()
上的池,但Connection
继续使用并再次遇到异常。这些不是池中的连接断开。应用程序正在使用它们Connection
。因此,在结账时(或签到)对它们进行测试并没有对它们做任何事情。
要摆脱这种情况,您需要检查应用程序代码中的异常处理。是否存在无效Connection
可能引发Exception
但是Exception
被抓住且Connection
重复使用的情况?
警告本身是无害的。它只是说c3p0已经知道Connection
是坏的,它不会发出一个事件来再次发出信号。