如何設定 Tomcat DataSource

Tomcat 的 DataSource 設定在 $CATALINA_HOME/conf/context.xml 裡。

Derby 的設定範例:
<Resource name="jdbc/EmbeddedDerbyDB"
          type="javax.sql.DataSource"
          maxActive="100"
          maxIdle="10"
          removeAbandoned="true"
          driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
          url="jdbc:derby:C:/DerbyDB;create=true"/>


Oracle 的設定範例:
<Resource name="jdbc/ORA"
          auth="Container"
          type="javax.sql.DataSource"
          maxActive="100"
          maxIdle="10"
          removeAbandoned="true"
          driverClassName="oracle.jdbc.OracleDriver"
          username="oradmin"
          password="ora1234"
          url="jdbc:oracle:thin:@192.168.100.100:1521:sid"/>


JDBC driver 是透過 java.sql.DriverManager 來管理註冊,而不同的 JDBC driver 只會被 java.sql.DriverManager 的 registerDriver 呼叫註冊一次。所以建議將 JDBC driver 放在 $CATALINA_BASE/lib 路徑下,以免造成 JVM Memory Leak 的問題。正確的 Class Loader 的順序,請參考 Class Loader HOW-TO 文件。

由於 Tomcat 的 DataSource 是採用 Apache Commons 專案中的 DBCPPool 來實作及管理,所以在 DataSource 的參數設定其實就是 DBCP 的參數設定。而這二個函式庫 DBCP 和 Pool 已經被包裝在單一 JAR 檔 $CATALINA_HOME/lib/tomcat-dbcp.jar 裡,其中 DBCP 1.4 已經支援 JDBC 4.0 規格。

DBCP 的參數設定可以參考網頁的說明,這裡先將比較常用的參數列舉說明一下。

一般基本參數:
參數名稱:username
說明:建立連線用的 username
參數名稱:password
說明:建立連線用的 password
參數名稱:url
說明:JDBC 的 url 字串
參數名稱:driverClassName
說明:JDBC dirver 的完整 class 名稱

常用參數:
參數名稱:maxActive
預設值:8
說明:Connection Pool 同時所能建立的連線最大數量。若為負值,則無上限。

參數名稱:maxIdle
預設值:8
說明:Connection Pool 同時所能允許閒置的連線最大數量。若為負值,則無上限。

參數名稱:validationQuery
預設值:無
說明:用來驗證測試連線是否成功。必須使用 SQL SELECT 語句,並且至少回傳一筆資料。以 Oracle 為例: select 1 from dual 。

參數名稱:removeAbandoned
預設值:false
說明:值為 true 時,當已建立的連線閒置時間超過 removeAbandonedTimout 設定值時,就會將連線棄置及移除。

參數名稱:removeAbandonedTimeout
預設值:300
說明:超過閒置秒數的連線會被移除。

範例程式:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/ORA");
Connection conn = ds.getConnection();

參考資料:
Tomcat JNDI Datasource HOW-TO
DBCP Configuration