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

sch*_*enk 7 spring hibernate c3p0

我们有一个带有 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!
Run Code Online (Sandbox Code Playgroud)

在我们配置的DataSource上

dataSource.setTestConnectionOnCheckin(true);
dataSource.setTestConnectionOnCheckout(true);
Run Code Online (Sandbox Code Playgroud)

但这没有帮助。我们预计连接会失败这些测试,然后进行更新。但这并没有发生。

对我们如何重建断开的连接有什么提示吗?

Ste*_*man 7

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

要解决这个问题,您需要检查应用程序代码中的异常处理。是否存在这样的情况:残疾人Connection可能抛出了Exception,但Exception被抓住并Connection重新使用?

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

  • 或许!使用和滥用 Hibernate 的方法有很多。在上面引用的位之后,应该记录异常堆栈跟踪。您可能想要检查该堆栈跟踪中的代码路径,并考虑在先前的异常之后如何到达那里。 (2认同)