2013-01-18 183 views
1

我已經配置Tomcat的DBCP爲:DBCP Tomcat的連接池removeAbandoned不工作

<Resource 
name="jdbc/myoracle" 
auth="Container" 
type="javax.sql.DataSource" 
driverClassName="oracle.jdbc.OracleDriver" 
url="jdbc:oracle:thin:@127.0.0.1:1521:mysid" 
username="abc" 
password="abc" 
maxActive="20" 
maxIdle="4" 
minIdle="0" 
maxWait="4" 
removeAbandoned="true" 
logAbandoned="true" 
removeAbandonedTimeout="3" 
/> 

我不知道,我已經定義了上面的設置正確與否。 我正在使用struts 2,一個網頁有菜單鏈接,這是調用動作類,我正在執行所有數據庫操作和打開/關閉連接從/到池。 問題是,如果我連續不斷地點擊菜單鏈接說40-50次,連接增加的地方,如單擊鼠標,然後等待響應,做得很好(即不增加連接)。

只有連續瘋狂點擊,而無需等待單個響應使得連接上漲突然,而不是來恢復到初始值。 如果我的連接在操作類的某個地方泄漏,那麼爲什麼總是單擊鼠標,等待響應,然後再次點擊鼠標,這樣做總是很好? (連續點擊相同的菜單鏈接結果:) 正如我已經定義maxActive爲20,連接將持續到24(我記得),並在該池已耗盡,即新的連接/請求無限期地等待得到來自用盡池的連接。

這裏我的疑問是,爲什麼removeAbandoned沒有關閉連接,因爲我指定removeAbandonedTimeout = 3。 如果我假設我有一個連接內存泄漏或我沒有故意關閉任何連接,然後removeAbandoned會殺死所有那些打開的連接或不是

或者我的DBCP設置或以上參數有任何問題嗎? 請幫我解決這個問題。

回答

2

我會說maxWait參數的值太小。根據documentation,其度量單位是毫秒。當所有可用的連接被分配時,在你的情況下它只會等待4毫秒並且會拋出異常。

此外,我建議增加minIdle參數值的值,以便在任何時候都會有幾個可用的「準備」連接。當然,您可能需要額外增加maxIdle參數值的值。

至於removeAbandonedTimeout參數,請確保其值爲多於運行任何數據庫操作所需的秒數。

還有一件事要記住的是,將logAbandoned設置爲true會給連接借用過程增加一些開銷。

+0

我試着增加一些值,但仍然是一樣的。 我明白removeAbandonedTimeout的值需要比no更多。運行任何數據庫操作所需的秒數,以避免連接中斷。 但是不removeAbandonedTimeout =「3」意味着關閉連接/或者將運行模式連接帶回池中? –

+0

爲什麼在連續50-60次鼠標點擊之後,連接池會耗盡並停止分配更多連接? –

+0

你的意思是說「增加一點價值」?問題是,所有的值都比默認值小得多(removeAbandonedTimeout = 60,maxActive = 100,maxIdle = maxActive = 100,minIdle = initialSize = 10,maxWait = 30000)。你有什麼具體的理由使用比默認值小得多的值?底線,如果你需要更多的連接,爲什麼不分配更多? –