資料庫連接是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連接的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連接池正是針對這個問題提出來的。
資料庫連接池負責分配、管理和釋放資料庫連接,它允許應用程式重複使用一個現有的資料庫連接,而再不是重建立立一個;釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏。這項技術能明顯提高對資料庫操作的效能。
資料庫連接池在初始化時將建立一定數量的資料庫連接放到串連池中,這些資料庫連接的數量是由最小資料庫連接數來設定的。無論這些資料庫連接是否被使用,串連池都將一直保證至少擁有這麼多的串連數量。串連池的最大資料庫連接數量限定了這個串連池能佔有的最大串連數,當應用程式向串連池請求的串連數超過最大串連數量時,這些請求將被加入到等待隊列中。資料庫連接池的最小串連數和最大串連數的設定要考慮到下列幾個因素:
1) 最小串連數是串連池一直保持的資料庫連接,所以如果應用程式對資料庫連接的使用量不大,將會有大量的資料庫連接資源被浪費;
2) 最大串連數是串連池能申請的最大串連數,如果資料庫連接請求超過此數,後面的資料庫連接請求將被加入到等待隊列中,這會影響之後的資料庫操作。
3) 如果最小串連數與最大串連數相差太大,那麼最先的串連請求將會獲利,之後超過最小串連數量的串連請求等價於建立一個新的資料庫連接。不過,這些大於最小串連數的資料庫連接在使用完不會馬上被釋放,它將被放到串連池中等待重複使用或是空閑逾時後被釋放。
在傳統的兩層結構中,用戶端程式在啟動時開啟資料庫連接,在退出程式時關閉資料庫連接。這樣,在整個程式運行中,每個用戶端始終佔用一個資料庫連接,即使在大量沒有資料庫操作的空閑時間,如使用者輸入資料時,從而造成資料庫連接的使用效率低下。
在三層結構模式中,資料庫連接通過中介層的串連池管理。只有當使用者真正需要進行資料庫操作時,中介層才從串連池申請一個串連,資料庫操作完畢,串連立即釋放到串連池中,以供其他使用者使用。這樣,不僅大大提高了資料庫連接的使用效率,使得大量使用者可以共用較少的資料庫連接,而且省去了建立串連的時間。
串連池的配置使用
資料庫連接池是應用伺服器的一項準系統,我們以Apusic Application Server為例,來說明JDBC串連池的配置使用。
Apusic JDBC串連池提供對多種資料庫的支援,如Oracle、MS SqlServer、Sybase、Informix、DB2等。
Apusic JDBC串連池可以通過資料庫本身的JDBC Driver串連到資料庫,也可以通過JDBC-ODBC橋串連到資料庫。下面我們以Oracle為例說明如何配置串連池:
Oracle資料庫的JDBC Driver包檔案classes111.zip在/usr/oracle/jdbc/lib(假設oracle的安裝目錄是/usr/oracle)目錄下,首先將classes111.zip加入到系統的CLASSPATH中。然後在apusic/config/apusic.conf(假設安裝目錄為apusic) 中作如下設定:
<SERVICE
CLASS="com.apusic.jdbc.PoolManager"
NAME="JdbcPool:name=jdbc/sample"
>
<ATTRIBUTE NAME="ExpirationTime" VALUE="300"/>
<ATTRIBUTE NAME="MinCapacity" VALUE="5"/>
<ATTRIBUTE NAME="URL" VALUE="jdbc:oracle:thin:@192.168.19.136:1521:orcl"/>
<ATTRIBUTE NAME="ConnectionProperties" VALUE="user=gtj,password=abc123"/>
<ATTRIBUTE NAME="DriverClassName" VALUE="oracle.jdbc.driver.OracleDriver" />
<ATTRIBUTE NAME="MaxCapacity" VALUE="30"/>
</SERVICE>
ExpirationTime: 逾時時間,單位是秒。當一個資料庫連接超過expirationTime設定時間不被使用
時,系統會自動關閉這個資料庫連接。預設值為300秒
MinCapacity: 最小串連數
URL: 資料庫的URL
ConnectionProperties: 串連屬性,其中:user使用者名稱,password密碼
DriverClassName: JDBC驅動程式類名
MaxCapacity: 最大串連數
192.168.19.136: oracle所在電腦的IP地址。
調用串連池
我們以一個JSP程式為例,說明如何使用串連池。首先通過JNDI得到DataSource,再的得到串連Connection,如下例所示:
<html>
<head>
<title>Jsp sample</title>
</head>
<body>
<p>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="
java.sql.*,
javax.naming.*,
javax.sql.*
"%>
<%
try{
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/sample");
Connection con = ds.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select ENAME from EMP");
while(rs.next()){
out.println("<p>" + rs.getString(1));
}
rs.close();
stmt.close();
}catch(Exception e){
System.out.println("jsp:" + e.getMessage());
}finally{
try{
con.close();
}catch(Exception e1){}
}
%>
</body>
</html>