天天看點

Tomcat中資料源的配置及原理

一:資料源介紹 資料源 簡 介 JDBC2.0提供了javax.sql.DataSource的接口,負責與資料庫建立連接配接,實際應用時不需要編寫連接配接資料庫代碼,可以直接從資料源獲得資料庫的連接配接,使得應用于資料庫的耦合降低。Dataource中事先建立了多個資料庫連接配接,這些資料庫連接配接保持在資料庫連接配接池中,當程式通路資料庫時,隻需要從連接配接池從取出空閑的連接配接,通路資料庫結束,在将這些連接配接歸還給連接配接池。DataSource對象由容器(Tomcat)提供,不能使用建立執行個體的方法來生成DataSource對象,要采用JAVA的JNDI(Java Nameing and Directory Interface,java命名和目錄接口)來獲得DataSource對象的引用。(另有一種說法:“其實從技術上來說,資料源連接配接方式是不需要目錄服務的,我們同樣可以通過序列化資料源對象直接通路檔案系統。這點是需要明确的。”感興趣的朋友可以試試。)JNDI是一種将對象和名字綁定的技術,對象工廠負責生産出對象,這些對象都和唯一的名字相綁定。程式中可以通過這個名字來獲得對象的引用。Tomcat把DataSource作為一種可配置的JNDI資源來處理,生成DataSource對象的工廠為org.apache.comm.ons.dbcp.BasicDataSourceFactory。 二: 配置資料源 在Tomcat中配置資料源其 實 相當 簡單,可以配置單個應用的資料源,也可以配置整個容器的資料源 。以下詳細說明如何配置單個應用的資料源。 1 .準備工作

  • Tomcat4.1.24 (其它版本也可以,原理相通的)
  •   确認在%Tomcat _Home%/common/lib下有commons-collections.jar、commons-dbcp.jar、commons-pool.jar包(tomcat預設有這些包),如果沒有,請到此地下載下傳: http://tomcat.apache.org/ 。這三個包是必需的。
  • 下載下傳相應資料庫驅動,放在%Tomcat _Home%/common/lib下。本例以oracle資料庫為例,使用的驅動包為: ojdbc14 .jar
  •   資料庫為Oracle9i
  • 确認在%Tomcat _Home%/common/lib下有jndi.jar、dbc2_0-stdext.jar(tomcat預設有這些包)。

2.配置單個應用的資料源 2.1配置server.xml檔案 首先打開%Tomcat _Home%/conf下 server.xml檔案,在相應的<Context>中加入<Resource>元素,在<Context>(你的應用配置上下文)中加入以下代碼(以oracle為例):

<Context path ="/Exercise001" reloadable="true" docBase="D:/eclipse/workspace/Exercise001" workDir="D:/eclipse/workspace/Exercise001/work/org/apache/jsp" > <!-- my dataConnectionPool seting here start--> <Resource name="jdbc/myoracle" scope="Shareable" type="javax.sql.DataSource"/>          <ResourceParams name="jdbc/myoracle">                       <parameter>                                  <name>factory</name>                                                                                                              <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>                       </parameter>                       <parameter>                                 <name>maxWait</name>                                <value>5000</value>                       </parameter>                       <parameter>                                   <name>maxActive</name>                                   <value>4</value>                       </parameter>                       <parameter>                                  <name>password</name>                                   <value>train</value>                       </parameter>                       <parameter>                                   <name>url</name>                                                                        <value>jdbc:oracle:thin:@ database- cn:1521:train007</value>                       </parameter>                       <parameter>                                   <name>driverClassName</name>

注意:oracle9i以上加載此驅動,而其它版本加載:racle.jdbc.OracleDriver

                                  <value>oracle.jdbc.driver.OracleDriver</value>

                      </parameter>                       <parameter>                                  <name>maxIdle</name>                                   <value>2</value>                       </parameter>                       <parameter>                                   <name>username</name>                                   <value>train</value>                       </parameter>            </ResourceParams>            <!-- my datapool seting here end--> </Context>  

2.2< Resource >配置說明如下:

屬性 描述
name 指定 Resource 的 JNDI 的名字
auth 指定管理 Resource 的 Manager ,由兩個可 選值 : Container 和 Application 。 Container 表示由容器來 創 建和管理 Resource , Application 表示由 WEB 應 用來 創 建和管理 Resource 。如果在 web application deployment descriptor 中使用 <resource-ref> , 這 個屬性是必需的,如果使用 <resource-env-ref> , 這 個屬性是可 選 的。
type 指定 Resource 所屬的 java 類 名

2.3<ResourceParams>元素的屬性如下:

屬性 描述
name 指定 ResourceParams 的 JNDI 的名字,必 須 和 Resource 的 name 保持一緻
factory 指定生成 DataSource 對 象的 factory 的 類 名
maxActive 指定資料 庫連 接池中 處 于活 動 狀 态 的資料 庫連 接最大數目, 0 表示不受限制
maxIdle 指定資料 庫連 接池中 處 于空 閑 狀 态 的資料 庫連 接的最大數目, 0 表示不受限制
maxWait 指定資料 庫連 接池中的資料 庫連 接 處 于空 閑 狀 态 的最 長時間 ( 單 位 為 毫秒),超 過這 一事件,将會抛出異常。 -1 表示可以無限期等待。
username 指定 連 接資料 庫 的用 戶 名
password 指定 連 接資料 庫 的密 碼
driverClassName 指定 連 接資料 庫 的 JDBC 驅動 程式
url 指定 連 接資料 庫 的 URL

2.3引用資料源 如果在web應用中通路了由Servlet容器管理的某個JNDI Resource,則必須在web.xml中聲明對這個JNDI Resource的引用。表示資源引用的元素為<resource-ref>,該元素加在<wepapp></ wepapp >中。 打開你的應用配置檔案web.xml,輸入以下粗體部分: <wepapp> …… <resource-ref>

<descryiption>DB Connection</descryiption>

<res-ref-name> jdbc/myoracle </res-ref-name>

<res-type>javax.sql.DataSource </res- type>

<res-auth>Container </res-auth>

</resource-ref> </ wepapp > 2 . 4 <resource-ref> 元素的屬性如下:

屬性 描述
description 對 所引用的 資 源的 說 明
res-ref-name 指定所引用 資 源的 JNDI 名字,與 <Resource> 元素中的 name 屬性保持一緻
res-type 指定所引用 資 源的 類 名字,與 <Resource> 元素中的 type 屬性保持一緻
res-auth 指定所引用 資 源的 Manager ,與 <Resource> 元素中的 auth 屬性保持一緻

2.5測試資料源      首先,檢查Tomcat的%Tomcat _Home%/common/lib下有commons-collections.jar、commons-dbcp.jar、commons-pool.jar包,如果沒現有,請到此地下載下傳: http://tomcat.apache.org/      注意以上三個包不要引入你的工程類路徑,否則可能報錯。      然後,将驅動包放入%Tomcat _Home%/common/lib下,注意包必須為 .jar字尾。Tomcat隻認 .jar包。 配置完成後,寫個測試,如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ page import="java.sql.*"%>

<%@ page import="javax.naming.*"%>

<%@ page import="javax.sql.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD 

HTML 4.01 Transitional//EN">

<html>

<head>

</head>

<body>

<%

Context initContext = new InitialContext();

Context envContext = (Context) initContext.lookup("java:/comp/env");

DataSource db = (DataSource)envContext.lookup("jdbc/myoracle ");

Connection conn = db.getConnection( );

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM test ");

while(rs.next()){

out.print(rs.getString("admin_name")+" ");

out.print(rs.getString("admin_password")+"<br>");

}

rs.close();

stmt.close();

conn.close();

%>

</body>

</html>

如果輸出你期望的結果,表示資料源配置成功。 3 .配置容器全局資料源     以上,配置的資料源為單個應用使用的資料源,隻能為單個應用所使用,下面我們配置全局的資料源,所有的應用都可以使用,通過引用很自然的使用全局資料源。準備工作同上。           3.1 配置server.xml檔案 首先打開%Tomcat _Home%/conf下 server.xml檔案,在<GlobalNamingResources>下輸入以下粗體部分: <GlobalNamingResources> …… <!-- my dataConnectionPool seting here start--> <Resource name="jdbc/myoracle" scope="Shareable" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/myoracle">                       <parameter>

此屬性必需

                                 <name>factory</name>                                                                            <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

                      </parameter>                       <parameter>                       <name>maxWait</name>                       <value>5000</value>                       </parameter>                       <parameter>                                   <name>maxActive</name>                                   <value>4</value>                       </parameter>                       <parameter>                                  <name>password</name>                                   <value>train</value>                       </parameter>                       <parameter>                                   <name>url</name>                                      <value>jdbc:oracle:thin:@ database- cn:1521:train007</value>                       </parameter>                       <parameter>

注意:oracle9i以上加載此驅動,而其它版本加載:racle.jdbc.OracleDriver

                                  <name>driverClassName</name>

                                  <value>oracle.jdbc.driver.OracleDriver</value>                       </parameter>                       <parameter>                                  <name>maxIdle</name>                                   <value>2</value>                       </parameter>                       <parameter>                                   <name>username</name>                                   <value>train</value>                       </parameter>            </ResourceParams>            <!-- my datapool seting here end--> </GlobalNamingResources> 3.2 引用資料源

由于我們配置的是容器全局資料源,是以所有的應用都可以引用這個資料源。在你的應用中建立引用,在<Context></Context>之間輸入以下粗體部分:

<Context path="/Exercise001" reloadable="true" docBase="D:/eclipse/workspace/Exercise001" workDir="D:/eclipse/workspace/Exercise001/work/org/apache/jsp" >

<ResourceLink name=" myDB "                        global="jdbc/myoracle"

                       type="javax.sql.DataSource"/>

</Context> 3.3 配置應用檔案web.xml 打開你的應用配置檔案web.xml,輸入以下粗體部分: <wepapp> …… <resource-ref>

<descryiption>DB Connection</descryiption>

<res-ref-name> myDB </res-ref-name>

<res-type>javax.sql.DataSource </res- type>

<res-auth>Container </res-auth>

</resource-ref> </ wepapp >   3.4測試   建立測試檔案:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ page import="java.sql.*"%>

<%@ page import="javax.naming.*"%>

<%@ page import="javax.sql.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD 

HTML 4.01 Transitional//EN">

<html>

<head>

</head>

<body>

<%

Context initContext = new InitialContext();

Context envContext = (Context) initContext.lookup("java:/comp/env");

DataSource db = (DataSource)envContext.lookup("myDB ");//名稱與web.xml配置中的一緻

Connection conn = db.getConnection( );

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM test");

while(rs.next()){

out.print(rs.getString("admin_name")+" ");

out.print(rs.getString("admin_password")+"<br>");

}

rs.close();

stmt.close();

conn.close();

%>

</body>

</html>

如果輸出你期望的結果,表示資料源配置成功。