2010-11-05 31 views
3

問我固定關係到我們使用的BasicDataSource,雖然我理解它的一部分我還有一些懸而未決的問題:)關於org.apache.commons.dbcp.BasicDataSource

問題的方式了一些bug: 數據庫失敗後,該應用程序無法自動連接到數據庫。

應用程序使用org.apache.commons.dbcp.BasicDataSource class作爲連接到Oracle數據庫的JDBC連接的TCP連接池。

修復: 經過一番研究,我發現在BasicDataSource testOnBorrow和testOnreturn沒有設置。我提供了驗證查詢來測試連接。這解決了問題

馬克斯沒有在池中的連接設置爲1

我的理解: 連接池將移交給應用程序的連接。 我認爲發生的事情是應用程序MAGICALLY當數據庫崩潰時將不良集合返回到池中。現在,由於Pool不知道它是否是錯誤的連接,它會在下次需要它時將相同的連接移交給應用程序,導致應用程序不能自動重新連接到db。

現在,修復後,每當一個錯誤的連接返回到連接池時,它將被丟棄並且不會再次使用,因爲我在上面做了修復。

現在我知道BasicDataSource在給予應用程序之前封裝連接,以便每當應用程序說con.close ..BasicDataSource會知道連接不再使用..它會照顧或者返回連接游泳池或discardigg等

懸而未決的問題: 但是我不明白是什麼使應用奇蹟般地返回到連接池時,它打破了連接[注意con.close方法不當連接不正常退出時調用]。 BasicDataSource沒有辦法知道連接已關閉或存在?有人可以指示我爲此編碼嗎?

我的整體理解連接爲什麼修復工作?

回答

0

查看test for abandoned connections,當請求新連接時,當池中的所有連接都處於「正在使用」狀態時,「正在使用」的連接將被測試放棄(它們保留上次使用時間的時間戳)。

BasicDataSource#setRemoveAbandoned(boolean)BasicDataSource#setRemoveAbandonedTimeout(int)

無論多麼聰明或不連接池是關閉廢棄的連接,你應該始終確保每個連接在關閉finally塊,如:

Connection conn = getConnection(); 
try { 
    ... // perform work 
} finally { 
    conn.close(); 
} 

或者使用其他方式,如Apache DBUtils

+0

我同意。我的觀點是,當應用程序崩潰時,JVM可能沒有機會執行conn.close()。 – codeObserver 2011-02-02 05:55:03

+0

我認爲這裏拋棄意味着[偶像x時間]。在這種情況下,應用程序[持續重試]應該始終[最終]獲得健康的連接,因爲廢棄的連接被刪除。這沒有發生。我認爲出於某種原因,在特定超時之後,如果偶數不管數據庫是否關閉,連接池就會將連接返回到池中,並將其交給應用程序。 – codeObserver 2011-02-02 06:00:25

4

現在,我知道這是一箇舊線程,但它在谷歌搜索結果中很高,所以我想我可能會給它一個快速答案。有關配置的BasicDataSource的更多信息,你應該引用DBCP配置頁:「?的BasicDataSource怎麼知道當一個連接abondoned,需要返回到連接池」 http://commons.apache.org/proper/commons-dbcp/configuration.html

要回答的「unanaswered」問題(釋義)...

org.apache.commons.dbcp.BasicDataSource能夠通過使用Connection的包裝類來監視它提供的連接上的流量和使用情況。每當你調用連接上的方法或從連接創建的任何語句時,實際上就是調用一個包裝類,它實現了一個接口或者用這些相同的方法擴展了一個基類(Hurray for Polymorphism!)。這些自定義方法允許DataSource知道Connection是否處於活動狀態。

在BasicDataSource本身上,有一個名爲「removeAbandoned」的屬性,另一個名爲「removeAbandonedTimeout」,用於配置將保留連接返回到連接池的行爲。

「removeAbandoned」是一個布爾值,指示是否應該將放棄的連接返回到池中。默認爲「false」。

「removeAbandonedTimeout」是一個int值,它表示在連接被視爲放棄之前應允許通過的不活動秒數。默認值是300(約5分鐘)。