c3p0 数据库池语句关闭失败 java.sql.SQLRecoverableException:关闭的连接

问题描述

我是 Java 和 c3p0 数据库池的新手。我们已经在 mulesoft 上构建了 api 并部署到了 cloudhub(vpc + vpn 配置),应用程序连接到内部数据库

应用程序日志显示以下警告,每 12 小时(正好)关闭一次连接

16:59:32.799     07/28/2021     Worker-0     C3P0PooledConnectionPoolManager[identityToken->|41d2c93]-HelperThread-#2     WARN
Statement close Failed.
java.sql.sqlRecoverableException: Closed Connection
    at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:3525)
    at oracle.jdbc.driver.OracleStatement.cloSEOrCache(OracleStatement.java:1478)
    at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1461)
    at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:122)
    at com.mchange.v1.db.sql.StatementUtils.attemptClose(StatementUtils.java:53)
    at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:325)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:510)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:464)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:436)
    at com.mchange.v2.resourcepool.BasicResourcePool$asynctestIdleResourceTask.run(BasicResourcePool.java:2211)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)

如果在过去几分钟内收到请求达到 12 小时,则它会失败并显示 500 错误 connection.ConnectionException: An attempt by a client to checkout a Connection has timed out

我已经配置了基于 spring 的数据源,这是我的配置

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-4.2.xsd">



<bean id="oracle-jdbcdatasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@${oracle.host}:${oracle.port}/${oracle.database}"/>
<property name="user" value="${oracle.username}"/>
<property name="password" value="${oracle.password}"/>
<property name="minPoolSize" value="1"/>
<property name="maxPoolSize" value="5"/>
<property name="initialPoolSize" value="1"/>
<property name="acquireIncrement" value="1"/>
<property name="idleConnectionTestPeriod" value="300"/>
<property name="maxStatements" value="0"/>
<property name="checkoutTimeout" value="60000"/>
<property name="testConnectionOnCheckout" value="true" />
<property name="testConnectionOnCheckin" value="true" />
<property name="preferredTestQuery" value="select 1 from dual" />
<property name="maxConnectionAge" value="14400" />
<property name="maxIdleTime" value="7200" />
</bean>
</beans>

我已将 maxConnectionAge 设置为 14400(4 小时)并将 maxIdleTime 设置为 7200(2 小时),所以我没想到会看到连接关闭错误,因为它应该在 12 小时和新连接之前破坏了连接应该就位。

版本详情

  • 骡运行时 - 4.3.0
  • Oracle jdbc8 - 19.3.0.0
  • c3p0 - 0.9.5.2

有人可以告诉我是否缺少 c3p0 池的任何配置吗?

谢谢

解决方法

我认为池配置没有任何问题。可能是VPN的重连问题,甚至是数据库本身的一些限制。

,

听起来您可能正在检出连接,但没有立即将它们重新检入。如果旧连接保持检出状态,c3p0 不会过期,只有在它们被检入之后。

“客户端尝试签出连接已超时”消息表明您最终已经耗尽了连接池,没有剩余要签出的连接并且已达到 maxPoolSize

>

当您的应用签出 Connections 时,它应该使用 try-with-resources 构造以确保 Connection 在使用后立即签入。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...