2012-07-31 72 views
5

我們有一個使用hibernate作爲ORM工具的api,我們使用c3p0作爲連接池處理程序。當我們負荷很重時,我們沒有任何問題。但是,如果api在一天左右停用,我們正在耗盡「無法獲得連接」的例外。所以,如果週末沒有人使用api,我們會在週一早上發現連接錯誤。不活動期間後的連接超時值

Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. 

我們使用mysql作爲數據庫。在我的研究中,我知道mySQL在8個小時左右之後會使連接失效。連接池可能會向客戶端發出一個陳舊的連接,從而導致客戶端的連接超時異常。

目前我們在C3Po中沒有配置任何連接測試。比方說,如果我使用IdleTestPeriod在連接池被給予客戶端之前測試連接。那麼如果我所有的連接在某個時間點都通過了測試,會發生什麼?將這些失敗的連接從池中移除並重新生成新的活動連接嗎?

目前,這是我們正在使用的c3p0設置。任何其他原因可能出現這個問題?

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="${----}"/> 
     <property name="jdbcUrl" value="${----}"/> 
     <property name="user" value="${----}"/> 
     <property name="password" value="${------}"/> 
     <property name="minPoolSize" value="5"/> 
     <property name="acquireIncrement" value="5" /> 
     <property name="maxPoolSize" value="125" /> 
     <property name="maxStatements" value="10" /> 
     <property name="maxIdleTime" value="180" /> 
     <property name="maxIdleTimeExcessConnections" value="30" /> 
     <property name="checkoutTimeout" value="3000" /> 
     <property name="preferredTestQuery" value="SELECT 1" /> 
    </bean> 

感謝您的幫助

回答

1

高可用性和集羣MySQL Java Connector的部分,看看屬性;具體爲autoReconnectautoReconnetForPools。 使用您的JDBC連接URL中的屬性。在使用MySQL,Hibernate和C3P0之前,他們幫助過我。希望這有助於。

9

因此,您有3秒(3000毫秒)的checkoutTimeout設置。這是你看到的例外。客戶端只允許等待三秒鐘才能檢出池中的連接;如果三秒鐘不夠,他們會看到你的例外。

問題是,爲什麼客戶需要這麼長時間才能獲得連接?通常檢查一個連接是一個非常快的操作。但是,如果所有連接都被檢出,則客戶端必須等待從數據庫中(緩慢)獲取連接。

您的池已配置爲非常積極地剔除連接。如果minPoolSize = 5以上的連接數超過maxIdleTimeExcessConnections = 30秒,則它們將被銷燬。然而,您的池配置爲大規模爆發:maxPoolSize = 125。假設你的應用安靜了一段時間,然後從客戶端得到一連串的連接請求。池將很快耗盡連接並開始以acquireIncrement = 5的突發獲取。但是,如果突然有25個客戶端,並且該池只有5個連接,那麼在獲取Connection之前,第25個客戶端可能會超時並不是不太可能。

有很多你可以做的。這些調整是可以分開的,你可以根據需要混合或匹配。 1)將閒置的「多餘」連接扼殺在較不積極的位置,這樣一般情況下,你的池有一定的能力來處理突發的請求。您可以完全刪除maxIdleTimeExcessConnections,並且讓連接慢慢地在maxIdleTime = 180秒廢棄之後到達。 (下行?在不活動期間較長的資源佔用空間較長)

2)將minPoolSize設置爲較高的值,以便池不太可能看到一連串的活動,而且它的活動太少Connections(Downside ?更大的永久資源足跡。)

3)從您的配置中刪除checkoutTimeout。 c3p0的默認設置是允許客戶端無限期地等待Connection。 (下行?也許你更喜歡客戶快速報告失敗,而不是等待可能的成功。)

我不認爲你觀察到的問題與連接測試或MySQL超時本身有很大關係,但這並不意味着你不應該處理這些問題。我會推遲nobeh對MySQL重新連接問題的建議。 (我不是一個大的MySQL用戶。)你應該考慮實現連接測試。你有一個preferredTestQuery,所以測試應該相當快。我通常的選擇是使用testConnectionOnCheckin和idleConnectionTestPeriod。見http://www.mchange.com/projects/c3p0/#configuring_connection_testing

祝你好運!

相關問題