2013-07-16 89 views
1

我有一個應用程序使用C3P0進行連接池。它一直工作得很好,但最近我在嘗試訪問數據庫時遇到以下異常。C3P0 maxPoolSize耗盡

com.amazon.carbonado.FetchException: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from [email protected] -- timeout at awaitAvailable() 

谷歌搜索時,我發現這是由於maxPoolSize被耗盡。我把游泳池的大小從25增加到100來檢查它是否是原因。它是暫時修復的,但是一段時間後,我在嘗試db連接時再次看到錯誤(當時沒有任何其他數據庫連接請求)。當我檢查數據庫中的活動/非活動連接時,v $ session中只有一個來自機器的條目。然而,我收到這個錯誤。我不明白在哪裏使用連接?

有人能告訴我爲什麼會發生這種情況。 C3P0中的maxPoolSize又代表什麼?是否可以檢出數據庫連接?

另外poolSize是否代表實際的dbConnections?

回答

3

有幾件事。 com.mchange.v2.resourcepool.TimeoutException表示您已設置checkoutTimeout並且已被超出。這通常是因爲你擊中了maxPoolSizeConnections沒有被快速返回,但不一定。如果這個值非常小,那麼Connection在一個未被最大化的池中獲取會引起這個問題。

說,這聽起來很像你所擁有的是一個Connection泄漏導致用盡池。 (驗證,未設置checkoutTimeout,看看您的應用程序最終無限期掛起,而不是拋出異常。)如果你正在泄漏的連接,要

  1. 一定要使用可靠的資源清理成語管理連接 - - here,點擊「顯示報價的剩餘部分」。

  2. 使用unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces追蹤並修復連接泄漏。另請參閱this discussion

祝你好運!