1. 程式人生 > >tomcat資料來源的配置和使用

tomcat資料來源的配置和使用

在Java語言中,DataSource物件就是一個代表資料來源實體的物件。一個數據源就是一個用來儲存資料的工具,它可以是複雜的大型企業級資料庫,也可以是簡單得只有行和列的檔案。資料來源可以位於在伺服器端,也可以位於客服端。

應用程式通過一個連線來訪問資料來源,那麼一個DataSource物件就是用於提供連線資料來源的工具。DataSource介面提供了兩個方法用於建立和資料來源的連線
使用DataSource物件建立和資料庫的連線比起使用DriverManager介面更加高效,雖然兩者的使用範圍都很相似,並且都提供了方法用於建立和資料庫的連線,設定連線的最大超時時間,獲取流、登入。

但兩者之間的區別更加明顯。和DriverManager不同,一個DataSource物件能夠識別和描述它所代表的資料來源的屬性,而且DataSource物件的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的關係,DataSource的建立、釋出、獨立於應用程式的管理都依靠JNDI技術。


在JDBC2.0或JDBC3.0中,所有的資料庫驅動程式提供商必須提供一個實現了DataSource介面的類,要使用資料來源必須首先在JNDI中註冊該資料來源物件。
如果在JNDI中註冊了資料來源物件,將會比起使用DriverManager來具有兩個方面的優勢:
首先程式不需要像使用DriverManager一樣對載入的資料庫驅動程式資訊進行硬編碼,程式設計師可以選擇先在JNDI中註冊這個資料來源物件,然後在程式中使用一個邏輯名稱來引用它,JNDI會自動根據你給出的名稱找到與這個名稱繫結的DataSource物件。然後就可以使用這個DataSource物件來建立和具體資料庫的連線了。

其次,使用實現了DataSource介面的類所具有的第二個優勢體現在連線池和分散式事務上。連線池通過對連線的複用而不是新建一個物理連線來顯著地提高程式的效率。從而適用於任務繁忙、負擔繁重的企業級分散式事務。

*************************************************************************************

二、JNDI簡介:
*************************************************************************************
JNDI是用於向Java程式提供目錄和命名功能的API。它被設計成獨立於特定的目錄服務,所以各種各樣的目錄都可以通過相同的方式進行訪問。

可以簡單地把JNDI理解為一種將物件和名字繫結的技術,物件工廠負責生產出物件,這些物件都和惟一的名字繫結。外部程式可以通過名字來獲取對某個物件的引用。


在Intranets(企業內部網)和Internates(網際網路)中目錄服務(Directory service)扮演了一個非常重要的角色,它能夠在眾多的使用者、機器、網路、服務、應用程式中訪問各種各樣的資訊。目錄服務提供了一系列的命名措施,用人類可以理解的命名方式來刻畫各種各樣的實體之間的關係

一個企業式計算環境(computing environment)通常是由若干代表不同部分的命名複合而成。比如在一個企業級環境中DNS(Domain Name System)通常被當成頂層的命名方案(top-level namein facility)區分不同的部門或組織。而這些部門或組織自己又可以使用諸如LADP或NDS的目錄服務

從使用者的角度來看,這些都是由不同的命名方案構成的複合名稱。URL就是一個很典型的例子,它由多個命名方案構成。使用目錄服務的應用程式必須支援這種複合構成方式

使用目錄服務API的Java開發人員獲得的好處不僅在於API獨立於特定的目錄或命名服務,而且可以通過多層的命名方案無縫訪問(seamless acess)目錄物件。實際上,任何的應用程式都可以將自身的物件和特定的命名繫結起來,這種功能可以使到任何的Java程式查詢和獲取任何型別的物件

終端使用者可以方便地使用邏輯名稱從而輕易地在網路上查詢和識別各種不同的物件,目錄服務的開發人員可以使用API方便地在不同的客服端之間切換而不需要作任何更改
*************************************************************************************


三、資料來源和連線池的關係:
*************************************************************************************
JDBC2.0提供了javax.sql.DataSource介面,它負責建立與資料庫的連線,在應用程式訪問資料庫時不需要編寫連線資料庫的程式碼,可以直接從資料來源獲得資料庫連線。

在DataSource中事先建立了多個數據庫連線,這些資料庫連線儲存在連線池(Connect Pool)中。Java程式訪問資料庫時,只需要從連線池中取出空閒狀態的資料庫連線;當程式訪問資料庫結束,再將資料庫連線放回連線池。
*************************************************************************************


四、資料來源和JNDI的關係:
*************************************************************************************
DataSource物件是由Tomcat提供的,因此不能在程式中採用建立一個例項的方式來生產DataSource物件,而需要採用Java的另一個技術JNDI,來獲得DataSource物件的引用。

Tomcat把DataSource作為一種可以配置的JNDI資源來處理。生成DataSource物件的工廠為org.apache.commons.dbcp.BasicDataSourceFactory。

在javax.naming包中提供了Context介面,該介面提供了將物件和名字繫結,以及通過名字檢索物件的方法。Context中的主要方法有:
bind(String name,Object object):將物件與一個名字繫結
lookup(String name):返回與指定的名字繫結的物件
*************************************************************************************


五、Tomcat中資料來源的配置:
*************************************************************************************
資料來源的配置涉及修改server.xml和web.xml,在server.xml中加入定義資料來源的元素<Resource>,在web.xml加入<resource-ref>元素,宣告該Web應用所引用的資料


A.在server.xml中加入<Resource>元素:<Resource>元素用來定義JNDI Resource。

屬性    描述
name    指定Resource的JNDI名字
auth    指定管理Resource的Manager,它有兩個可選值:Container、Application
type    指定Resource所屬的Java類名

<Resource name = "jdbc/BookDb" 
auth = "Container" 
        type = "javax.sql.DataSource" />

B.在<Resource>元素中加入<ResourceParams>元素:<ResourceParams>元素用來指定各種引數值

屬性    描述
factory    指定生成的DataResource的factory類名
maxActive    指定資料庫連線池中處於活動狀態的最大連線數目,0表示不受限制
maxIdle    指定資料庫連線池中處於空閒狀態的最大連線數目,0表示不受限制
maxWait    指定連線池中連線處於空閒狀態的最長時間,超過會丟擲異常,-1表示無限
username    指定連線資料庫的使用者名稱
password    指定連線資料庫的口令
driverClassName    指定連線資料庫的JDBC驅動程式
url             指定連線資料庫的URL

   <ResourceParams name = "jdbc/BookDb">

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

    <parameter>
       <name>maxActive</name>
       <value>100</value>
    </parameter>

    <parameter>
       <name>maxIdle</name>
       <value>30</value>
    </parameter>

    <parameter>
       <name>maxWait</name>
       <value>10000</value>
    </parameter>

    <parameter>
       <name>username</name>
       <value>user</value>
    </parameter>

    <parameter>
       <name>password</name>
       <value>1234</value>
    </parameter>  

    <parameter>
       <name>driverClassName</name>
       <value>com.mysql.jdbc.Driver</value>
    </parameter>

    <parameter>
       <name>url</name>
       <value>jdbc:mysql//localhost:3306/BookDb?autoReconnect=true</value>
    </parameter>  

</ResourceParams>

C.在web.xml中加入<resource-ref>元素:<resource-ref>元素表示在Web應用中引用JNDI資源

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

*************************************************************************************


六、在Web應用中使用資料來源:
*************************************************************************************
javax.naming.Context提供了查詢JNDI Resource的介面,可以通過三個步驟來使用資料來源物件:

A.獲得對資料來源的引用:
Context ctx = new InitalContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/BookDb");

    B.獲得資料庫連線物件:
        Connection con = ds.getConnection();

    C.返回資料庫連線到連線池:
        con.close();



在連線池中使用close()方法和在非連線池中使用close()方法的區別是:前者僅僅是把資料庫連線物件返回到資料庫連線池中,是連線物件又恢復到空閒狀態,而非關閉資料庫連線,而後者將直接關閉和資料庫的連線
*************************************************************************************


七、釋出使用資料來源的Web應用:
*************************************************************************************
如果直接同JDBC訪問資料庫,可以把JDBC驅動程式拷貝到Web應用的WEB-INF/lib目錄或者Tomcat安裝目錄下的common/lib目錄下。

如果通過資料來源訪問資料庫,由於資料來源由Servlet容器建立並維護,所以必須把JDBC驅動程式拷貝到Tomcat安裝目錄下的common/lib目錄下,確保Servlet容器能夠訪問驅動程式。
*************************************************************************************