【问题标题】:c3p0 connection Pooling error - Oracle RACc3p0 连接池错误 - Oracle RAC
【发布时间】:2015-12-22 06:31:27
【问题描述】:

在一个 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 上的评论,这些警告与无效/陈旧的连接有关。

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

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

【问题讨论】:

    标签: connection-pooling c3p0


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。最初,当两个节点都启动时,将获得一些连接。当一个节点关闭时,数据库操作将由另一个仍在运行的实例处理。那么在节点宕机之前首先获得的连接仍然有效吗?已经看到,节点宕机后的前几条记录没有插入到数据库中。
    • 不,一旦一个节点宕机,到它的连接就会失效。您应该配置连接测试,以便不向客户端提供错误的连接。那么只有在数据库关闭时已经签出的连接才会遇到错误。请看mchange.com/projects/c3p0/#simple_advice_on_connection_testing
    • 史蒂夫,最后一件事。如果我使用连接测试(preferredTestQuery,testConnectionOnCheckout),是否有助于避免上面看到的警告,这些警告可能是在节点关闭并且使用该实例获取的那些连接变得无效的时间间隔内引起的?
    • 无论如何,您都应该是using some form of Connection testing,但您仍然可能会看到这些消息。您看到的消息可能来自语句缓存。 (如果它们正在使用客户端连接,您会在查询尝试和关闭()时看到问题)即使连接未在使用中,缓存的 PreparedStatements 仍保持打开状态,c3p0 将尝试以一种或另一种方式关闭()关闭连接时的那些语句,即使它们另一端的服务器无效。
    • 如果您关闭语句缓存(不要设置配置参数maxStatementsmaxStatementsPerConnection)并打开连接测试,您可能会很少看到错误。但希望您从语句缓存中获得性能提升。 (这只是我的一个有根据的猜测,这些可能会被语句缓存关闭。如果你有更长的堆栈跟踪,它们会提供更多的确定性。)
    猜你喜欢
    • 2018-11-26
    • 2017-10-16
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多