一般來說,在多人使用的系統(tǒng)中,應(yīng)用程式若沒有運(yùn)用 Connection pooling
的機(jī)制,會(huì)造成很大的效能問題,Connection 開開關(guān)關(guān),除了慢,也會(huì)耗損資料庫伺服器的資源。大部分的 AP Server 都有提供
Connection pooling 的機(jī)制,程式設(shè)計(jì)師並無須去顧慮這個(gè)機(jī)制是如何運(yùn)作的,只要懂得設(shè)定相關(guān)的參數(shù)即可。
假如說,某種狀況下,我們必須自行建置 Connection pooling
的機(jī)制時(shí),該如何進(jìn)行呢?自己寫當(dāng)然是非常不劃算的,況且也不一定寫的好,在這裡,我們使用 jakata project 裡的一個(gè)子專案
DBCP,來快速的建置一個(gè)隨處可用的 Connection pooling 機(jī)制。
在 Tomcat 裡,DBCP 是內(nèi)建的,用來管理 DB Connection pooling。這個(gè)機(jī)制是可移植且可獨(dú)立出來使用的,要在你的運(yùn)用程式中加上 DBCP 的功能,你必須至 http://jakarta.apache.org/commons/index.html
這個(gè)網(wǎng)址,找到該網(wǎng)頁內(nèi)的 Components,共有三個(gè)必須下載:Collections 、 DBCP 、 Pool 。DBCP 是運(yùn)用
Collections 及 Pool 這二個(gè)基礎(chǔ)的 Components 所設(shè)計(jì)出來的。當(dāng)然,如果你有安裝 Tomcat
server,最佳的方式是至 $TOMCAT_HOME/common/lib/ 目錄下去取得,保證版本的配合度不會(huì)出現(xiàn)問題。在 Tomcat
server 裡,以 Tomcat 5.0.19 版內(nèi)附的最新版本,這三個(gè) Components 的檔名分別是
commons-collections.jar 、 commons-pool-1.1.jar 及 commons-dbcp-1.1.jar。
取得使用 DBCP 必備的 jar 檔後,請(qǐng)記得將這些 jar 檔,放置到 CLASSPATH 中,或直接放至
$JAVA_HOME/jre/lib/ext/ 目錄內(nèi)。不過,由於 DBCP 有運(yùn)用到 DataSource 的功能,而這功能是 J2EE
才有的,所以你還必須去下載 J2EE 的一個(gè) javax.jar 檔。
環(huán)境建置好之後,接下來就可以開始設(shè)計(jì) Connection Pooling 的機(jī)制,在這兒,我們介紹最簡(jiǎn)單的作法,只要幾行指令就可以完成了,請(qǐng)看範(fàn)例區(qū)裡的程式及其說明。
範(fàn)例:
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 * 空的建構(gòu)元,不作任何處理動(dòng)作。
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 }
完成這個(gè)程式後,接下來在你的應(yīng)用程式裡,用 DBConnect.getConnection() 來取得 DB Connection,就能享受到 Connection Pooling 的功能了。
在實(shí)際的運(yùn)作中,這個(gè)範(fàn)例有加上偵錯(cuò)指令,會(huì)顯示出目前 Connection Pool 裡,有多少個(gè) Idle 的 Connection 及多少個(gè) Active 的 Connection,可供作為系統(tǒng)運(yùn)作的參數(shù)調(diào)整依據(jù)。