2013-04-10 27 views
0

是一個愚蠢的錯誤,同時複製連接主機我的數據庫,讓我指出一個不正確的終點......這阻止了初始化過程30分鐘...如何檢測不正確的端點使用C3P0池和JDBC

和最後例外:

  • 收購嘗試失敗!!!清理未完成的採集。在嘗試獲取所需的新資源時,我們未能成功超過允許的最大收購嘗試次數(30)。

試圖重現錯誤,我只是點着下面的連接字符串google.es

的jdbc:mysql的://google.es/myDB

初始化C3P0池...融爲一體。 mchange.v2.c3p0.ComboPooledDataSource [acquireIncrement - > 1,acquireRetryAttempts - > 30,acquireRetryDelay - > 1000,autoCommitOnClose - > false,automaticTestTable - > null,breakAfterAcquireFailure - > false,checkoutTimeout - > 0,connectionCustomizerClassName - > null,connectionTesterClassName - > com.mchange.v2.c3p0.impl.DefaultConnectionTester,dataSourceName - > 1hgeksr8t1vk3sn21ui8jk0 | 53689fd0,debugUnreturnedConnectionStac kTraces - > false,description - > null,driverClass - > com.mysql.jdbc.Driver,factoryClassLocation - > null,forceIgnoreUnresolvedTransactions - > false,identityToken - > 1hgeksr8t1vk3sn21ui8jk0 | 53689fd0,idleConnectionTestPeriod - > 0,initialPoolSize - > 3,jdbcUrl - > jdbc:mysql://google.es/myDB,maxAdministrativeTaskTime - > 0,maxConnectionAge - > 0,maxIdleTime - > 3600,maxIdleTimeExcessConnections - > 300,maxPoolSize - > 5,maxStatements - > 0,maxStatementsPerConnection - > 0,minPoolSize - > 1,numHelperThreads - > 3,preferredTestQuery - >空值,屬性 - > {用戶= * ,密碼= *},propertyCycle - > 0,statementCacheNumDeferredCloseThreads - > 0,testConnectionOnCheckin - >假,testConnectionOnCheckout - > false,unreturnedConnectionTimeout - > 0,userOverrides - > {},usesTraditionalReflectiveProxies - > false]

和初始化卡對於那些渴望30分鐘......

我想它拋出一個異常快,但我不確知我應該觸及其配置值:C3P0 acquireRetryAttempts?或者jdbc socketTimeout?並且最重要的是,如果我改變它,它可能會中斷...

回答

0

的問題在於JDBC超時配置。

由於在這個博客上規定:Understanding JDBC Internals & Timeout Configuration

JDBC默認爲0毫秒的連接如和套接字超時,即不超時。

如果目標端點存在但沒有回答(數據包可能被防火牆吞下),連接仍會被困住,並且只有在整整一分鐘後(爲什麼一分鐘?仍然是一個莫名其妙的)c3p0嘗試連接重試...因此異常出現後過長...

解決方案是在JDBC中添加一個connectTimeout = XXXms(可以作爲參數傳遞:mysql://google.es/myDB?connectTimeout = 1000),並在分鐘(重試延時1秒30秒,重試延時1秒)異常發生...

仍然所有參數需要根據您的需要進行調整,因爲它們有其他影響並可能會中斷功能。還建議檢查c3p0 forum thread有關可能的配置,如激活breakAfterAcquireFailure。

0

默認設置將花費大約30秒(不是30分鐘!)來檢測不良數據庫:它使acquireRetryAttempts = 30延遲acquireRetryDelay = 1000毫秒,然後才能斷定無法獲取連接。如果您希望更快地檢測到不良的端點,請回顧其中一個或兩個變量。如果您願意,可以將acquireRetryAttempts設置爲1,在這種情況下,連接獲取的任何異常將被解釋爲端點的問題。

http://www.mchange.com/projects/c3p0/#configuring_recovery

+0

是的,這是我所期望的,但不是我觀察到的......我確切地計時了,它需要30分30秒才能失敗,這導致我斷定每個連接在被考慮之前停留1分鐘重試。 – Daren 2013-04-10 12:11:03

+0

嗯......這必須是你的網絡設置和/或MySQL的某種問題。你有沒有看過http://stackoverflow.com/questions/1292856/why-connect-to-mysql-is-so-slow http://forums.mysql.com/read.php?24,23390,23390 – 2013-04-10 17:33:49

+0

是的,我雖然首先,但我的問題是配置...我的猜測仍然與JDBC配置參數,而不是c3p0,我控制更多...默認的JDBC沒有超時的連接...所以當「谷歌「沒有回答,它停留在那裏等待...也許一分鐘(和第二種形式c3p0)後來一個新的連接開始,事情慢慢地下地獄......但改變的socketTimeout似乎並沒有影響它..得到了一個仔細的調試。 – Daren 2013-04-10 17:39:43