我们有一个带有 Spring、Hibernate、C3P0、Oracle DB 驱动程序堆栈(后面有 Oracle DB)的 Web 应用程序。 有时我们会遇到较长时间的阻塞锁,然后在数据库端被杀死。 (我们知道这是由糟糕的应用程序设计引起的,我们将修复它,但这不是这个问题的重点)。 在数据库会话被数据库终止后,连接池似乎重用了现在断开的连接,这导致了错误:
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);
但这并没有帮助。我们预计连接会失败这些测试,然后进行更新。但这并没有发生。
对于我们如何重新创建断开的连接有任何提示吗?
当
已经签出的
Connection
经历Exception
导致c3p0将其视为无效(因此它不会在close()
上重新合并回池中)时,会发出此警告,但 Connection
继续使用并再次遇到异常。这些不是池中断开的连接。应用程序在使用它们时,它们被破坏了。因此,在结账(或签入)时测试它们对它们没有任何作用。要解决这个问题,您需要检查应用程序代码中的异常处理。是否存在无效
Connection
可能抛出
Connection
,但 Exception
被捕获并且 Exception
被重新使用的情况?警告本身是无害的。这只是说 c3p0 已经知道
Connection
不好,它不会再次发出事件来发出信号。