Apache Tomcat 的默認(rèn)數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)基于的是 Apache Commons 項(xiàng)目的庫(kù),具體來(lái)說(shuō)是這兩個(gè)庫(kù):
這兩個(gè)庫(kù)都位于一個(gè) JAR 文件中:$CATALINA_HOME/lib/tomcat-dbcp.jar。但該文件只包括連接池所需要的類,包名也已經(jīng)改變了,以避免與應(yīng)用沖突。
DBCP 2.0 支持 JDBC 4.1。
可參閱 DBCP 文檔了解完整的配置參數(shù)。
數(shù)據(jù)庫(kù)連接池創(chuàng)建并管理著一些與數(shù)據(jù)庫(kù)的連接。與打開(kāi)新的連接相比,回收或重用現(xiàn)有的數(shù)據(jù)庫(kù)連接要更為高效一些。
連接池化還存在一個(gè)問(wèn)題。Web 應(yīng)用必須明確地關(guān)閉 ResultSet、Statement,以及 Connection。假如 Web 應(yīng)用無(wú)法關(guān)閉這些資源時(shí),會(huì)導(dǎo)致這些資源再也無(wú)法被重用,從而造成了數(shù)據(jù)庫(kù)連接池“泄露”。如果再也沒(méi)有可用連接時(shí),最終這將導(dǎo)致 Web 應(yīng)用數(shù)據(jù)庫(kù)連接失敗。
針對(duì)該問(wèn)題,有一個(gè)解決辦法:通過(guò)配置 Apache Commons DBCP,記錄并恢復(fù)這些廢棄的數(shù)據(jù)庫(kù)連接。它不僅能恢復(fù)這些連接,而且還能針對(duì)打開(kāi)這些連接而又永遠(yuǎn)不關(guān)閉它們的代碼生成堆棧跟蹤。
為了配置 DBCP 數(shù)據(jù)源來(lái)移除并回收廢棄的數(shù)據(jù)庫(kù)連接,將下列屬性(一個(gè)或全部)添加到你的 DBCP 數(shù)據(jù)源中的 Resource 配置中:
removeAbandonedOnBorrow=true
removeAbandonedOnMaintenance=true
以上屬性默認(rèn)都為 false。注意,只有當(dāng) timeBetweenEvictionRunsMillis 為正值,從而啟用池維護(hù)時(shí),removeAbandonedOnMaintenance 才能生效。關(guān)于這些屬性的詳情,可查看 DBCP 文檔 。
使用 removeAbandonedTimeout 屬性設(shè)置某個(gè)數(shù)據(jù)庫(kù)連接閑置的秒數(shù),超過(guò)此時(shí)段,即被認(rèn)為是廢棄連接。
removeAbandonedTimeout="60"
默認(rèn)的去除廢棄連接的超時(shí)為 300 秒。
將 logAbandoned 設(shè)為 true,可以讓 DBCP 針對(duì)那些拋棄數(shù)據(jù)庫(kù)連接資源的代碼,記錄堆棧跟蹤信息。
logAbandoned="true"
默認(rèn)為 false。