2013-04-30 36 views
2

我試圖在我們的服務中導致一些隨機的,間歇性的「凍結」,並且在放棄幾個問題後,我們爲應用程序啓用了c3p0調試級別日誌記錄,並且我們認爲它看起來像是c3p0配置問題。我們使用「Oracle數據庫11g企業版版本11.2.0.3.0 - 64位生產」作爲我們的數據庫。c3p0 - 任何問題設置initialPoolSize = minPoolSize = maxPoolSize?

從日誌摘錄顯示兩行是服務調用的一部分。這兩條線之間沒有3秒的活動,我無法特別指出任何事情。

12 Apr 2013 02:25:42,386 [DEBUG] (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#8) com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool: Test of PooledConnection [[email protected]] on CHECKIN has SUCCEEDED. 

12 Apr 2013 02:25:45,443 [DEBUG] com.mchange.v2.c3p0.stmt.GooGooStatementCache: checkinStatement(): com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache stats -- total size: 85; checked out: 0; num connections: 5; num keys: 85 

的C3P0結構如下所示。

acquireIncrement = 2; 
acquireRetryAttempts = 0;   # keep retrying forever 
acquireRetryDelay = 10000;   # 10 secs. 
checkoutTimeout = 1000;    # 1 secs. 
idleConnectionTestPeriod = 60;  # 1 min. 
maxConnectionAge = 1800;   # 30 mins. 
maxIdleTime = 1800;     # 30 mins. 
maxIdleTimeExcessConnections = 120; 
maxPoolSize = 30; 
maxStatementsPerConnection = 25; 
minPoolSize = 30; 
initialPoolSize = 30; 
numHelperThreads = 16; # asynchronous threads 
preferredTestQuery = "SELECT 1 FROM dual"; 
testConnectionOnCheckin = true; 

我不知道是否有配置問題導致凍結?另外,我想知道是否可以通過設置minPoolSize = maxPoolSize來影響性能(負面)。我無法找到有答案的類似問題/問題。我並不擔心應用程序啓動時間,但當連接達到其「年齡」時會發生什麼?我想了解c3p0在處理過時連接時的行爲。

爲了給出負載的概念,我們可以獲得大約300個服務呼叫/分鐘。 CPU /內存使用率都在合理的水平內,沒有什麼特別感興趣的。

任何見解將不勝感激。 謝謝! -Ameya

回答

0

1)minPoolSize = maxPoolSize = initialPoolSize應該沒問題,雖然它不是我測試過的配置!

2)主要是你的配置看起來不錯!幾個狡辯:

  • 的2 acquireIncrement意味着,在一些平靜期後上升負載期間,客戶端的約50%將面臨一些延遲等待連接採集。我會使收益增加3到5;

  • acquireRetryDelay = 10000表示如果任何一種隨機毛刺導致採集嘗試失敗,任何形式的獲取新連接的隨機故障都將導致客戶端在空閒池中等待10秒鐘。 10000是一個很高的設置。

  • 你並沒有注意到顯式的APPARENT DEADLOCK消息,但是你正在使用Oracle +語句高速緩存對他們負責的配置。有些Oracle驅動程序存在一個問題,那就是在嘗試關閉()一個緩存Statement時,如果它的父Connection正在使用(例如,用於測試)導致凍結,最終迫使該池清除並重新創建其幫助程序線程。您已經給自己提供了很多幫助線程,這可能有助於避免此問題,但是在封面之下,您可能會因線程池中的線程堵塞而導致性能受損。 c3p0-0.9.2有一個配置參數,如果設置的話,i)在父連接正在使用時小心避免關閉緩存的PreparedStatements,ii)使用專用線程關閉這些語句。我建議你試試這個。請升級,如果你還沒有準備好,到c3p0-0.9.2.1並設置

    c3p0.statementCacheNumDeferredCloseThreads=1 
    

    (這是不太可能,你會需要一個以上的線程只是關閉()語句,但你可以設置爲較大的值如果您願意,請參閱here。)

祝你好運!

+0

非常感謝!我將做必要的改變。 – 2013-04-30 14:39:45