一般來說,在多人使用的系統中,應用程式若沒有運用 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 ); 22 return ds;
23 }
24
25
26 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,可供作為系統運作的參數調整依據。