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

问题描述 投票:0回答:1

我们有一个带有 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);

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

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

spring hibernate c3p0
1个回答
8
投票

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

要解决这个问题,您需要检查应用程序代码中的异常处理。是否存在无效

Connection

可能抛出

Connection
,但
Exception
被捕获并且
Exception
被重新使用的情况?

警告本身是无害的。这只是说 c3p0 已经知道

Connection

不好,它不会再次发出事件来发出信号。

    

© www.soinside.com 2019 - 2024. All rights reserved.