數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。對數(shù)據(jù)庫連接的管理能顯著影響到整個應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo)。數(shù)據(jù)庫連接池正是針對這個問題提出來的。
數(shù)據(jù)庫連接池負責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時,這些請求將被加入到等待隊列中。數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設(shè)置要考慮到下列幾個因素:
1) 最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫連接,所以如果應(yīng)用程序?qū)?shù)據(jù)庫連接的使用量不大,將會有大量的數(shù)據(jù)庫連接資源被浪費;
2) 最大連接數(shù)是連接池能申請的最大連接數(shù),如果數(shù)據(jù)庫連接請求超過此數(shù),后面的數(shù)據(jù)庫連接請求將被加入到等待隊列中,這會影響之后的數(shù)據(jù)庫操作。
3) 如果最小連接數(shù)與最大連接數(shù)相差太大,那么最先的連接請求將會獲利,之后超過最小連接數(shù)量的連接請求等價于建立一個新的數(shù)據(jù)庫連接。不過,這些大于最小連接數(shù)的數(shù)據(jù)庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復(fù)使用或是空閑超時后被釋放。
在傳統(tǒng)的兩層結(jié)構(gòu)中,客戶端程序在啟動時打開數(shù)據(jù)庫連接,在退出程序時關(guān)閉數(shù)據(jù)庫連接。這樣,在整個程序運行中,每個客戶端始終占用一個數(shù)據(jù)庫連接,即使在大量沒有數(shù)據(jù)庫操作的空閑時間,如用戶輸入數(shù)據(jù)時,從而造成數(shù)據(jù)庫連接的使用效率低下。
在三層結(jié)構(gòu)模式中,數(shù)據(jù)庫連接通過中間層的連接池管理。只有當(dāng)用戶真正需要進行數(shù)據(jù)庫操作時,中間層才從連接池申請一個連接,數(shù)據(jù)庫操作完畢,連接立即釋放到連接池中,以供其他用戶使用。這樣,不僅大大提高了數(shù)據(jù)庫連接的使用效率,使得大量用戶可以共享較少的數(shù)據(jù)庫連接,而且省去了建立連接的時間。
連接池的配置使用
數(shù)據(jù)庫連接池是應(yīng)用服務(wù)器的一項基本功能,我們以Apusic Application Server為例,來說明JDBC連接池的配置使用。
Apusic JDBC連接池提供對多種數(shù)據(jù)庫的支持,如Oracle、MS SqlServer、Sybase、Informix、DB2等。
Apusic JDBC連接池可以通過數(shù)據(jù)庫本身的JDBC Driver連接到數(shù)據(jù)庫,也可以通過JDBC-ODBC橋連接到數(shù)據(jù)庫。下面我們以O(shè)racle為例說明如何配置連接池:
Oracle數(shù)據(jù)庫的JDBC Driver包文件classes111.zip在/usr/oracle/jdbc/lib(假設(shè)oracle的安裝目錄是/usr/oracle)目錄下,首先將classes111.zip加入到系統(tǒng)的CLASSPATH中。然后在apusic/config/apusic.conf(假設(shè)安裝目錄為apusic) 中作如下設(shè)置:
<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: 超時時間,單位是秒。當(dāng)一個數(shù)據(jù)庫連接超過expirationTime設(shè)定時間不被使用
時,系統(tǒng)會自動關(guān)閉這個數(shù)據(jù)庫連接。默認值為300秒
MinCapacity: 最小連接數(shù)
URL: 數(shù)據(jù)庫的URL
ConnectionProperties: 連接屬性,其中:user用戶名,password密碼
DriverClassName: JDBC驅(qū)動程序類名
MaxCapacity: 最大連接數(shù)
192.168.19.136: oracle所在計算機的IP地址。
調(diào)用連接池
我們以一個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>
posted on 2008-06-15 14:30
Hank1026 閱讀(13350)
評論(0) 編輯 收藏 所屬分類:
每日積累