簡體   English   中英

c3p0-設置initialPoolSize = minPoolSize = maxPoolSize時遇到任何問題?

[英]c3p0 - Any issues setting initialPoolSize = minPoolSize = maxPoolSize?

我試圖從根本上在服務中造成一些隨機的,間歇性的“凍結”,並且在丟棄了幾個問題之后,我們為應用程序打開了c3p0調試級別日志記錄,我們認為這似乎是c3p0配置問題。 我們使用“ Oracle數據庫11g企業版11.2.0.3.0版-64位生產”作為我們的數據庫。

日志摘錄顯示了兩行,它們是服務調用的一部分。 這兩行之間有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 [com.mchange.v2.c3p0.impl.NewPooledConnection@1507a7] 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

1)minPoolSize = maxPoolSize = initialPoolSize應該沒有問題,盡管這不是我已經測試過的配置!

2)大多數情況下,您的配置看起來都不錯! 一些小問題:

  • acquisitionIncrement為2意味着,在經過一段時間的平靜之后負載增加期間,大約50%的客戶端將在等待Connection獲取方面遇到一些延遲。 我會將acquireIncrement增大為3到5;

  • acquisitionRetryDelay = 10000表示,如果任何形式的隨機故障導致獲取嘗試失敗,則獲取新Connection的任何形式的隨機失敗都會導致客戶端在空池上的wait()等待10秒。 10000是高設置。

  • 您沒有觀察到顯式的APPARENT DEADLOCK消息,但是您正在對它們非常負責的配置中使用Oracle +語句緩存。 某些Oracle驅動程序存在問題,在這種情況下,在其父連接正在使用(例如用於測試)時嘗試關閉()緩存的語句會導致凍結,最終迫使池清除並重新創建其輔助線程。 您已經給自己提供了很多幫助程序線程,這可能有助於避免此問題,但是在幕后,由於線程在線程池中阻塞,您可能會遇到性能下降的情況。 c3p0-0.9.2具有一個配置參數,如果設置了該參數,則i)小心避免在使用父連接的同時避免關閉緩存的PreparedStatements,並且ii)並使用專用線程關閉此類語句。 我建議你試試看。 如果尚未升級,請升級到c3p0-0.9.2.1並設置

     c3p0.statementCacheNumDeferredCloseThreads=1 

    (雖然您可以根據需要將其設置為更大的值,但為close()語句使用多個線程是不太可能的。請參見此處 。)

祝好運!

暫無
暫無

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

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