2017-04-26 62 views
0

我在tomcat版本7上部署了一個java應用程序。對於數據源,我使用了連接到mysql數據庫的c3p0。 它工作正常多年,最近我開始得到這個錯誤: 「客戶端超時等待從com.mchange.v2.resourcepool.BasicResourcePool獲取資源」。c3p0客戶端超時,等待從com.mchange.v2.resourcepool.BasicResourcePool獲取資源

當我遇到此問題時,唯一的解決方案是重新啓動應用程序。重新啓動mysql並沒有幫助。

我也有PHP應用程序使用保存數據庫,他們不受影響,他們正常工作。

我的Java應用程序只用於一個小團隊,它是一個後端應用程序。

這裏是我的C3P0配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db?relaxAutoCommit=true&amp;autoReconnect=true&amp;autoReconnectForPools=true" /> 
    <property name="user" value="viva4578" /> 
    <property name="password" value="amd139fbg" /> 
    <property name="initialPoolSize" value="5" /> 
    <property name="minPoolSize" value="5" /> 
    <property name="maxPoolSize" value="20" /> 
    <property name="maxConnectionAge" value="14400" /> 
    <property name="checkoutTimeout" value="30000" /> 
    <property name="acquireIncrement" value="1" /> 
    <property name="acquireRetryAttempts" value="30" /> 
    <property name="testConnectionOnCheckin" value="true" /> 
    <property name="testConnectionOnCheckout" value="true" /> 
    <property name="preferredTestQuery" value="SELECT 1" /> 
    <property name="idleConnectionTestPeriod" value="3600" /> 
    <property name="maxIdleTime" value="7200" /> 
    <property name="maxIdleTimeExcessConnections" value="1800" /> 
    <property name="unreturnedConnectionTimeout" value="3600" /> 
    <property name="debugUnreturnedConnectionStackTraces" value="true" /> 
</bean> 

這裏是C3P0的輸出日誌啓動應用程序後:

Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ 
    acquireIncrement -> 1, 
    acquireRetryAttempts -> 30, 
    acquireRetryDelay -> 1000, 
    autoCommitOnClose -> false, 
    userOverrides -> {}, 
    automaticTestTable -> null, 
    breakAfterAcquireFailure -> false, 
    checkoutTimeout -> 30000, 
    connectionCustomizerClassName -> null, 
    connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, 
    contextClassLoaderSource -> caller, 
    dataSourceName -> z8kflt9n1b12nsh118544e|7bc1a68b, 
    debugUnreturnedConnectionStackTraces -> true, 
    description -> null, 
    driverClass -> com.mysql.jdbc.Driver, 
    extensions -> {}, 
    factoryClassLocation -> null, 
    forceIgnoreUnresolvedTransactions -> false, 
    forceUseNamedDriverClass -> false, 
    identityToken -> z8kflt9n1b12nsh118544e|7bc1a68b, 
    idleConnectionTestPeriod -> 3600, 
    initialPoolSize -> 5, 
    jdbcUrl -> jdbc:mysql://localhost:3306/db?relaxAutoCommit=true&autoReconnect=true&autoReconnectForPools=true, 
    maxAdministrativeTaskTime -> 0, 
    maxConnectionAge -> 14400, 
    maxIdleTime -> 7200, 
    maxIdleTimeExcessConnections -> 1800, 
    maxPoolSize -> 20, 
    maxStatements -> 0, 
    maxStatementsPerConnection -> 0, 
    minPoolSize -> 5, 
    numHelperThreads -> 3, 
    preferredTestQuery -> SELECT 1, 
    privilegeSpawnedThreads -> false, 
    properties -> {user=******, password=******}, 
    propertyCycle -> 0, 
    statementCacheNumDeferredCloseThreads -> 0, 
    testConnectionOnCheckin -> true, 
    testConnectionOnCheckout -> true, 
    unreturnedConnectionTimeout -> 3600, 
    usesTraditionalReflectiveProxies -> false 
] 

我使用C3P0的版本0-0.9.5。

如果有人能幫助

謝謝

回答

0

這裏

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

已配置C3P0到拋出此異常,如果客戶端無法獲得在30秒內提供服務。這開始發生。據推測DataSource的負載增加了。考慮擴展它。使maxPoolSize變大,同時增加numHelperThreads以防止問題在異步任務中積壓。 (您也可以增加checkoutTimeout的值,或刪除設置,以便客戶端結帳永不超時,這將消除此異常,但不是真的問題,30秒是等待連接的很長時間。調整c3p0以提供連接的速度可能會比這更快)

+0

好,非常感謝您的意見。我的意見30秒是很多,除非有緩慢的查詢。 – kchetoua

+0

我換了一個log4j的配置,現在我看到這個異常 – kchetoua

+0

簽出的資源已過期,並且將被銷燬:com.mchange.v2.c3p0.impl.NewPooledConnection 也許這就是問題的根本原因是什麼? – kchetoua

相關問題