簡體   English   中英

c3p0的連接超時問題

[英]Connection timedout issue with c3p0

我將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:客戶端嘗試檢出Connection的嘗試已超時。 在com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)在com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)在com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)上的.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)在org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction。 )於org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.getConnection(BaseExecutor.java:336)於org.apache.ibatis.executor的org.apache.ibatis.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:60)。 org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)的org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)的SimpleExecutor.prepareStatement(SimpleExecutor.java:84) .apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)在org.apache.ibatis.session.defaults.DefaultSqlSession.update(De faultSqlSession.java:198)...還有9個引起原因:com.mchange.v2.resourcepool.TimeoutException:客戶端在等待從com.mchange.v2.resourcepool.BasicResourcePool@501edcf1獲取資源時超時。 com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable()位於com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)處com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)處的awaitAvailable(BasicResourcePool.java:1467) com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)處的com.mchange.v2.v2.c3Pool.check.Remote(BasicResourcePool.Java:554) 685)

...另外18個

配置有什么問題或如何解決此問題?

您可以輕松解決超時問題。 只需暫停一下時間,那就是從您的配置中刪除此行...

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

...或者延長超時時間。

但是真正的問題是,為什么事情如此緩慢,以至於有時客戶端需要2秒鍾以上的時間才能獲得連接。 值得一提的是,鑒於池的大小,這可能太小了:

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

也許嘗試10個線程或12個線程。

還有這個

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

您可能想擺脫。 如果您還沒有設置unreturnedConnectionTimeout ,它對您沒有任何好處,並且確實會降低性能。 這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM