隨筆-51  評論-14  文章-0  trackbacks-0
          數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫連接池正是針對這個問題提出來的。

          數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。

          數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。數據庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素:

          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>

          posted on 2008-06-15 14:30 Hank1026 閱讀(13351) 評論(0)  編輯  收藏 所屬分類: 每日積累
          主站蜘蛛池模板: 新营市| 衡阳县| 乐至县| 桂林市| 日照市| 大洼县| 个旧市| 桐柏县| 涞水县| 龙泉市| 基隆市| 嘉黎县| 肇州县| 德清县| 阳朔县| 赤壁市| 台前县| 清流县| 西平县| 宝应县| 横峰县| 阳曲县| 化德县| 保亭| 定日县| 宣恩县| 土默特右旗| 息烽县| 翁牛特旗| 乌鲁木齐县| 教育| 崇仁县| 英超| 依兰县| 德格县| 中宁县| 九台市| 河南省| 光山县| 石棉县| 自治县|