java Tomcat數據庫連接池


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

 

< 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" />

參數含義: 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 異常

使用連接池的好處是

數據庫操作性能得到提升
通過連接池管理數據庫的連接與釋放、提高了系統資源的使用效率


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM