Vincent.Chan‘s Blog

          常用鏈接

          統計

          積分與排名

          網站

          最新評論

          使用 DBCP 作 DB Connection pooling

          一般來說,在多人使用的系統中,應用程式若沒有運用 Connection pooling 的機制,會造成很大的效能問題,Connection 開開關關,除了慢,也會耗損資料庫伺服器的資源。大部分的 AP Server 都有提供 Connection pooling 的機制,程式設計師並無須去顧慮這個機制是如何運作的,只要懂得設定相關的參數即可。

          假如說,某種狀況下,我們必須自行建置 Connection pooling 的機制時,該如何進行呢?自己寫當然是非常不劃算的,況且也不一定寫的好,在這裡,我們使用 jakata project 裡的一個子專案 DBCP,來快速的建置一個隨處可用的 Connection pooling 機制。

          在 Tomcat 裡,DBCP 是內建的,用來管理 DB Connection pooling。這個機制是可移植且可獨立出來使用的,要在你的運用程式中加上 DBCP 的功能,你必須至 http://jakarta.apache.org/commons/index.html 這個網址,找到該網頁內的 Components,共有三個必須下載:Collections 、 DBCP 、 Pool 。DBCP 是運用 Collections 及 Pool 這二個基礎的 Components 所設計出來的。當然,如果你有安裝 Tomcat server,最佳的方式是至 $TOMCAT_HOME/common/lib/ 目錄下去取得,保證版本的配合度不會出現問題。在 Tomcat server 裡,以 Tomcat 5.0.19 版內附的最新版本,這三個 Components 的檔名分別是 commons-collections.jar 、 commons-pool-1.1.jar 及 commons-dbcp-1.1.jar。

          取得使用 DBCP 必備的 jar 檔後,請記得將這些 jar 檔,放置到 CLASSPATH 中,或直接放至 $JAVA_HOME/jre/lib/ext/ 目錄內。不過,由於 DBCP 有運用到 DataSource 的功能,而這功能是 J2EE 才有的,所以你還必須去下載 J2EE 的一個 javax.jar 檔。

          環境建置好之後,接下來就可以開始設計 Connection Pooling 的機制,在這兒,我們介紹最簡單的作法,只要幾行指令就可以完成了,請看範例區裡的程式及其說明。

          範例:

          01 package util;
          02
          03 import java.sql.*;
          04 import javax.naming.*;
          05 import javax.sql.*;
          06
          07 import org.apache.commons.dbcp.BasicDataSource;
          08
          09 public class DBConnect {
          10 static DataSource dataSource = null;
          11
          12 publicstatic DataSource setupDataSource( String sDrvName, String sUserName,
          13 String sPwd, String connectURI ) {
          14 BasicDataSource ds = new BasicDataSource();
          15 ds.setDriverClassName( sDrvName );
          16 ds.setUsername( sUserName );
          17 ds.setPassword( sPwd );
          18 ds.setUrl( connectURI );
          19 ds.setMaxActive( 50 );
          20 ds.setMaxIdle( 10 );
          21 ds.setMaxWait( 10000 ); // 10 seconds
          22 return ds;
          23 }
          24
          25
          26 // static init of the class
          27 static {
          28 try {
          29 System.setProperty( "jdbc.drivers", "oracle.jdbc.driver.OracleDriver" );
          30 Class.forName( "oracle.jdbc.driver.OracleDriver" );
          31
          32 dataSource = setupDataSource( "oracle.jdbc.driver.OracleDriver", "username",
          33 "password", "jdbc:oracle:thin:@192.168.0.1:1521:SID" );
          34 }
          35 catch (Exception e) {
          36 System.out.println( "DBConnect.java => Unable to load driver." + e.getMessage() );
          37 }
          38 }
          39
          40 /**
          41 * 空的建構元,不作任何處理動作。
          42 */
          43 public DBConnect() {}
          44
          45 /**
          46 * 取得 DB Connection.
          47 */
          48 publicstatic Connection getConnection() throws SQLException,ClassNotFoundException {
          49 BasicDataSource bds = (BasicDataSource) dataSource;
          50 System.out.println("NumActive: " + bds.getNumActive() + ","
          51 + "NumIdle: " + bds.getNumIdle() );
          52 return dataSource.getConnection();
          53 }
          54 }

          完成這個程式後,接下來在你的應用程式裡,用 DBConnect.getConnection() 來取得 DB Connection,就能享受到 Connection Pooling 的功能了。

          在實際的運作中,這個範例有加上偵錯指令,會顯示出目前 Connection Pool 裡,有多少個 Idle 的 Connection 及多少個 Active 的 Connection,可供作為系統運作的參數調整依據。

          posted on 2006-03-23 00:02 Vincent.Chen 閱讀(420) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 宣恩县| 五莲县| 永登县| 安远县| 安福县| 青岛市| 读书| 遂平县| 高雄市| 庆元县| 万盛区| 疏勒县| 淮北市| 无为县| 合肥市| 砀山县| 肇州县| 安义县| 永安市| 台安县| 绥棱县| 乌拉特前旗| 安化县| 永胜县| 隆子县| 贵港市| 张家界市| 广西| 楚雄市| 许昌县| 兰坪| 高青县| 文山县| 左云县| 清远市| 邯郸县| 增城市| 罗江县| 秦安县| 屯留县| 南和县|