【问题标题】:Connection timedout issue with c3p0c3p0 的连接超时问题
【发布时间】:2019-12-30 07:20:14
【问题描述】:

我使用 c3p0 作为 Java 8 应用程序的连接池以及 ibatis 作为 ORM 工具。数据库经常出现连接超时问题。以下是配置参数。

   <property name="minPoolSize" value="60" />
                                <property name="maxPoolSize" value="200" />
                                <property name="initialPoolSize" value="60" />
                                <property name="statementCacheNumDeferredCloseThreads" value="1" />
                                <property name="acquireRetryAttempts" value="2"/>
                                <property name="checkoutTimeout" value="2000" />
                                <property name="debugUnreturnedConnectionStackTraces" value="true"/>
                                <property name="maxIdleTime" value="120"/>
                                <property name="autoCommitOnClose" value="false" />
                                <property name="testConnectionOnCheckin" value="true" />
                                <property name="numHelperThreads" value="3" />

这里是堆栈跟踪:

原因:java.sql.SQLException:客户端检出连接的尝试已超时。 在 com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118) 在 com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77) 在 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690) 在 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) 在 org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:138) 在 org.apache.ibatis.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:60) 在 org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336) 在 org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84) 在 org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) 在 org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) 在 org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) 在 org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198) ... 9 更多 原因:com.mchange.v2.resourcepool.TimeoutException:客户端在等待从 com.mchange.v2.resourcepool.BasicResourcePool@501edcf1 获取资源时超时——在 awaitAvailable() 处超时 在 com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1467) 在 com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644) 在 com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554) 在 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758) 在 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)

... 18 个以上

配置有什么问题或者我该如何解决这个问题?

【问题讨论】:

标签: java-8 connection-pooling c3p0 ibatis


【解决方案1】:

您可以轻松解决超时问题。只需取消超时,即从您的配置中删除此行...

<property name="checkoutTimeout" value="2000" />

...或者延长超时时间。

但真正的问题是为什么事情如此缓慢以至于有时客户端需要超过 2 秒才能获得连接。突出的一件事是,鉴于池的大小,这可能太小了:

<property name="numHelperThreads" value="3" />

也许试试 10 个线程,或者 12 个。

还有,这个……

<property name="debugUnreturnedConnectionStackTraces" value="true"/>

你可能想摆脱。如果您还没有设置unreturnedConnectionTimeout,它对您没有任何好处,并且它确实有性能成本。见here

【讨论】:

  • 感谢您的帮助!我会试一试。此外,关于 debugUnreturnedConnectionStackTraces,我们已将此属性设置为 true 以获取错误的堆栈跟踪。
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2011-02-21
  • 2015-01-07
  • 2018-10-12
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多