c3p0 连接池错误 - Oracle RAC

c3p0 connection Pooling error - Oracle RAC

在一个 2 节点集群上,当一个节点关闭时,会看到以下 c3p0 错误:

2015-11-10 10:00:25,655 | WARN  | scheduler-1          | org.apache.log4j.Category | Exception on close of inner statement.
java.sql.SQLRecoverableException: Closed Connection
at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5416)
    at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1585)
    at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1570)
    at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.close(OraclePreparedStatementWrapper.java:82)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.close(NewProxyPreparedStatement.java:1811)

以上警告后跟:

2015-11-10 10:00:25,668 | WARN  | DefaultQuartzScheduler_Worker-10 | org.apache.log4j.Category | [c3p0] Another error has occurred [ java.sql.SQLRecoverableException: Closed Connection ] which will not be reported to listeners!
    java.sql.SQLRecoverableException: Closed Connection
        at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5416)
        at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1585)
        at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1570)
        at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94)

根据 Steve Swaldman 在 c3p0 github page 上的评论,这些警告与 invalid/stale 个连接有关。

那么在 oracle RAC 环境中,当一个实例关闭时,节点启动时已经获取的连接会发生什么运行?在大多数情况下,数据库操作在节点关闭后运行良好。只有少数插入失败并抛出上述警告。 c3p0 连接池是否适合在 RAC 环境中使用?

有关警告的更多信息:http://sourceforge.net/p/c3p0/mailman/message/18310863/

上面显示的警告看起来不是问题。 c3p0 正在尝试清理其父连接已关闭()的语句。

一般来说,c3p0 会在常见配置下从数据库中断中正常恢复。但是您可能会看到一些警告和异常,因为测试开始失败,然后尝试清理也失败了。

c3p0 应该可以与 Oracle RAC 一起正常工作。但是,Oracle的Universal Connection Pool offers special support for RAC-specific features那个c3p0没有提供。