天天看點

java Tomcat資料庫連接配接池

1. 在tomcat伺服器目錄下面的conf中找到一個叫Context.xml的配置檔案,在其中加入以下代碼

java Tomcat資料庫連接配接池

<Resource name="jdbc/books" 

auth="Container"type="javax.sql.DataSource" maxActive="100" 

maxIdle="30" maxWait="10000" username="sa" password="120010" 

driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 

url="jdbc:sqlserver://localhost:1433;DatabaseName=news"/>

java Tomcat資料庫連接配接池

參數含義: JNDI (java naming and directory interface): Java 命名和目錄接口

maxActive="100"

表示并發情況下最大可從連接配接池中擷取的連接配接數。如果資料庫不是單獨,供一個應用使用,通過設定maxActive參數可以避免某個應用無限制的擷取連接配接對其他應用造成影響,如果一個資料庫隻是用來支援一個應用那麼maxActive理論上可以設定成該資料庫可以支撐的最大連接配接數。maxActive隻是表示通過連接配接池可以并發的擷取的最大連接配接數。連接配接的擷取與釋放是雙向,當應用程式并發請求連接配接池時,連接配接池就需要從資料庫擷取連接配接,那麼但應用程式使用完連接配接并将連接配接歸還給連接配接池時,連接配接池是否也同時将連接配接歸還給資料庫呢?很顯然答案是否定的,如果那樣的話連接配接池就變得多此一舉,不但不能提高性能,反而會降低性能,那麼但應用成歸還連接配接後,連接配接池如何處理呢?

maxIdle="30"

如果在并發時達到了maxActive=100,那麼連接配接池就必須從資料庫中擷取100個連接配接來供應用程式使用,當應用程式關閉連接配接後,由于maxIdle=30,是以并不是所有的連接配接都會歸還給資料庫,将會有30個連接配接保持在連接配接池種中,狀态為空閑。

minIdle=”2”

最小預設情況下并不生效,它的含義是當連接配接池中的連接配接少有minIdle,系統監控線程将啟動補充功能,一般情況下我們并不啟動補充線程。

問題:如何設定maxActive和maxIdle?

理論上講maxActive應該設定成應用的最大并發數,這樣一來即便是在最大并發的情況下,應用依然能夠從連接配接池中擷取連接配接,但是困難時的是我們很難準确估計到最大并發數,設定成最大并發數是一種最優的服務品質保證,事實上,如果某個使用者登入提示系統繁忙,那麼在他再次登入時,可能系統資源已經充足,對于拜特資金管理系統我們建議将maxActive設定為系統注冊人數的十分之一到二十分之一之間。例如系統的注冊人數為1000,那麼設定成50-100靠近100的數字,例如85或90。

 maxIdle對應的連接配接,實際上是連接配接池保持的長連接配接,這也是連接配接池發揮優勢的部分,理論上講保持較多的長連接配接,在應用請求時可以更快的響應,但是過多的連接配接保持,反而會消耗資料庫大量的資源,是以maxIdle也并不是越大越好,同上例我們建議将 maxIdle設定成

50-100中靠近50的數字,例如55。這樣就能在兼顧最大并發同時,保持較少的資料庫連接配接,而且在絕大多情況,能夠為應用程式提供最快的相應速度。

 removeAbandoned="true"

removeAbandonedTimeout="60"

logAbandoned="true"

有時粗心的程式編寫者在從連接配接池中擷取連接配接使用後忘記了連接配接的關閉,這樣連池的連接配接就會逐漸達到maxActive直至連接配接池無法提供服務。現代連接配接池一般提供一種“智能”的檢查,但設定了removeAbandoned="true"時,當連接配接池連接配接數到達(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)時便會啟動連接配接回收,那種活動時間超過removeAbandonedTimeout="60"的連接配接将會被回收,同時如果logAbandoned="true"設定為true,程式在回收連接配接的同時會列印日志。removeAbandoned是連接配接池的進階功能,理論上這中配置不應該出現在實際的生産環境,因為有時應用程式執行長事務,可能這種情況下,會被連接配接池誤回收,該種配置一般在程式測試階段,為了定位連接配接洩漏的具體代碼位置,被開啟,生産環境中連接配接的關閉應該靠程式自己保證。

2. 第二步将 資料驅動.jar 放入tomcat目錄下的lib或common\lib下面

3. 第三步,打開應用程式的 Web.xml檔案,添加以下配置

<resource-ref>

<res-ref-name>jdbc/books</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

節點資料來源于Context.xml裡面設定的資料

4. 在java檔案中先導入以下包

import javax.sql.DataSource;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

将原來的資料庫連接配接操作

Class.forName("oracle.jdbc.driver.OracleDriver");

if( conn == null || conn.isClosed() ) 

conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL",

"system",

"accp");

換成

Context c = new InitialContext();

DataSource ds = (DataSource)c.lookup("java:comp/env/jdbc/books");

conn = ds.getConnection();

記得要捕獲 NamingException 與 SQLException 異常

使用連接配接池的好處是

資料庫操作性能得到提升

通過連接配接池管理資料庫的連接配接與釋放、提高了系統資源的使用效率

如何聯系我:【萬裡虎】www.bravetiger.cn

【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)

【部落格】http://www.cnblogs.com/kenshinobiy/