java連線池技術
連線池運作原理:
在實際應用開發中,特別是在WEB應用系統中,如果JSP、Servlet或EJB使用JDBC直接訪問資料庫中的資料,每一次資料訪問請求都必須經歷建立資料庫連線、開啟資料庫、存取資料和關閉資料庫連線等步驟,而連線並開啟資料庫是一件既消耗資源又費時的工作,如果頻繁發生這種資料庫操作,系統的效能必然會急劇下降,甚至會導致系統崩潰。資料庫連線池技術是解決這個問題最常用的方法,在許多應用程式伺服器(例如:Weblogic, WebSphere,JBoss)中,基本都提供了這項技術,無需自己程式設計,但是,深入瞭解這項技術是非常必要的。
如果有對Java感興趣程式設計師,可來我們的Java交流扣qun哦:854818273裡面免費送Java的系統教程噢! 小編也是一名從事了8年的高階架構師,花了近兩個月整理了一份較適合當下學習的乾貨,以及我這8年的工作經驗,分享給每一位想學Java的小夥伴,這裡是Java學習者聚集地,歡迎進階中的小夥伴。
資料庫連線池技術的思想非常簡單,將資料庫連線作為物件儲存在一個Vector物件中,一旦資料庫連線建立後,不同的資料庫訪問請求就可以共享這些連線,這樣,通過複用這些已經建立的資料庫連線,可以克服上述缺點,極大地節省系統資源和時間。
資料庫連線池的主要操作如下:
(1)建立資料庫連線池物件(伺服器啟動)。
(2)按照事先指定的引數建立初始數量的資料庫連線(即:空閒連線數)。
(3)對於一個數據庫訪問請求,直接從連線池中得到一個連線。如果資料庫連線池物件中沒有空閒的連線,且連線數沒有達到最大(即:最大活躍連線數),建立一個新的資料庫連線。
(4)存取資料庫。
(5)關閉資料庫,釋放所有資料庫連線(此時的關閉資料庫連線,並非真正關閉,而是將其放入空閒佇列中。如實際空閒連線數大於初始空閒連線數則釋放連線)。
(6)釋放資料庫連線池物件(伺服器停止、維護期間,釋放資料庫連線池物件,並釋放所有連線)。
1.先把連線oracle的驅動放到tomcat5.5/common/lib目錄中,,這樣他就可以自動找到驅動.
*****javaee裡面的四個引用包都要拷到 webroot裡面的web-inf裡面的lib檔案下
2.在tomcat5.5目錄下找到conf目錄下找到server.xml檔案
在這個檔案中 找到context標籤,在標籤context中加入以下標籤
<!--未打包好的原始碼路徑docBase,打包好即:docBase="FileUpload.war"-->
****測試時不能用war,否則後果很嚴重
<Context path="/FileUpload" docBase="D:/workspace/FileUpload/WebRoot">
<Resource
name="jdbc/oracle"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
password="hpp"
maxIdle="30"
maxActive="100"
maxWait="5000"
username="hpp"
url="jdbc:oracle:thin:
</Context>
3.引數說明
Tomcat連線池中,部分引數說明如下:
name:為這個連線池指定一個名字
type:資料來源型別, 一般不需要動
driverClassName:驅動名字,一般也不需要動
password 和username都不用說吧
maxActive="100" < !--最大活躍連線數,這裡取值為100,表示同時最多有100個數據庫連線。設為0表示無限制。-->
maxIdle="30" < !--最大的空閒連線數,這裡取值為30,表示即使沒有資料庫連線時依然可以保持30個空閒的連線,而不被清除,隨時處於待命狀態。設為0表示無限制。-->
maxWait="10000" < !--最大建立連線等待時間。如果超過此時間將接到異常。這裡設定為10000,表示10秒後超時。設為-1表示無限制,直到超時為止。-->
PS:如果最大資料庫活躍連線數過大,可想而知,記憶體佔用量是非常驚人的!如果空閒連線數過大,則資源利用率低,連線池長期未釋放,可導致連線池結點異常。所以選好maxActive和maxIdle是連線池效能的關鍵因素,當然這取決於伺服器環境。
JDBC獲取Connection的方法也要改變
private final String driver="oracle.jdbc.driver.OracleDriver";
private final String url="jdbc:oracle:thin:@localhost:1521:orcl";
private final String user="hfq";
private final String pwd="hfq";
Connection conn=null;
// public TJDBC(){
// try {
// Class.forName(driver);
// try {
// conn=DriverManager.getConnection(url,user,pwd);
// conn.setAutoCommit(false);//設定自動提交
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
public TJDBC(){
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/oracle");// jdbc/oracl名稱
conn = ds.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}