天若有情

          到教堂懺悔,愿主安撫我罪惡的心靈......
          posts - 4, comments - 35, trackbacks - 0, articles - 24
          2007-08-02

          Tomcat 的數(shù)據(jù)源使用(1)

          關(guān)鍵字: Tomcat
          一、數(shù)據(jù)源簡介

            在Java語言中,DataSource對象就是一個代表數(shù)據(jù)源實體的對象。一個數(shù)據(jù)源就是一個用來存儲數(shù)據(jù)的工具,它可以是復(fù)雜的大型企業(yè)級數(shù)據(jù)庫,也可以是簡單得只有行和列的文件。數(shù)據(jù)源可以位于在服務(wù)器端,也可以位于客服端。

            應(yīng)用程序通過一個連接來訪問數(shù)據(jù)源,那么一個DataSource對象就是用于提供連接數(shù)據(jù)源的工具。DataSource接口提供了兩個方法用于建立和數(shù)據(jù)源的連接。

            使用DataSource對象建立和數(shù)據(jù)庫的連接比起使用DriverManager接口更加高效,雖然兩者的使用范圍都很相似,并且都提供了方法用于建立和數(shù)據(jù)庫的連接,設(shè)置連接的最大超時時間,獲取流、登錄。
            
            但兩者之間的區(qū)別更加明顯。和DriverManager不同,一個DataSource對象能夠識別和描述它所代表的數(shù)據(jù)源的屬性,而且DataSource對象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的關(guān)系,DataSource的建立、發(fā)布、獨立于應(yīng)用程序的管理都依靠JNDI技術(shù)。
             
            在JDBC2.0或JDBC3.0中,所有的數(shù)據(jù)庫驅(qū)動程序提供商必須提供一個實現(xiàn)了DataSource接口的類,要使用數(shù)據(jù)源必須首先在JNDI中注冊該數(shù)據(jù)源對象。

            如果在JNDI中注冊了數(shù)據(jù)源對象,將會比起使用DriverManager來具有兩個方面的優(yōu)勢:

            首先程序不需要像使用DriverManager一樣對加載的數(shù)據(jù)庫驅(qū)動程序信息進行硬編碼,程序員可以選擇先在JNDI中注冊這個數(shù)據(jù)源對象,然后在程序中使用一個邏輯名稱來引用它,JNDI會自動根據(jù)你給出的名稱找到與這個名稱綁定的DataSource對象。然后就可以使用這個DataSource對象來建立和具體數(shù)據(jù)庫的連接了。

            其次,使用實現(xiàn)了DataSource接口的類所具有的第二個優(yōu)勢體現(xiàn)在連接池和分布式事務(wù)上。連接池通過對連接的復(fù)用而不是新建一個物理連接來顯著地提高程序的效率。從而適用于任務(wù)繁忙、負擔(dān)繁重的企業(yè)級分布式事務(wù)。


            二、JNDI簡介:

            JNDI是用于向Java程序提供目錄和命名功能的API。它被設(shè)計成獨立于特定的目錄服務(wù),所以各種各樣的目錄都可以通過相同的方式進行訪問。

            可以簡單地把JNDI理解為一種將對象和名字綁定的技術(shù),對象工廠負責(zé)生產(chǎn)出對象,這些對象都和惟一的名字綁定。外部程序可以通過名字來獲取對某個對象的引用。

            在Intranets(企業(yè)內(nèi)部網(wǎng))和Internates(互聯(lián)網(wǎng))中目錄服務(wù)(Directory service)扮演了一個非常重要的角色,它能夠在眾多的用戶、機器、網(wǎng)絡(luò)、服務(wù)、應(yīng)用程序中訪問各種各樣的信息。目錄服務(wù)提供了一系列的命名措施,用人類可以理解的命名方式來刻畫各種各樣的實體之間的關(guān)系。

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

            從用戶的角度來看,這些都是由不同的命名方案構(gòu)成的復(fù)合名稱。URL就是一個很典型的例子,它由多個命名方案構(gòu)成。使用目錄服務(wù)的應(yīng)用程序必須支持這種復(fù)合構(gòu)成方式。

            使用目錄服務(wù)API的Java開發(fā)人員獲得的好處不僅在于API獨立于特定的目錄或命名服務(wù),而且可以通過多層的命名方案無縫訪問(seamless acess)目錄對象。實際上,任何的應(yīng)用程序都可以將自身的對象和特定的命名綁定起來,這種功能可以使到任何的Java程序查找和獲取任何類型的對象。

            終端用戶可以方便地使用邏輯名稱從而輕易地在網(wǎng)絡(luò)上查找和識別各種不同的對象,目錄服務(wù)的開發(fā)人員可以使用API方便地在不同的客服端之間切換而不需要作任何更改。


            三、數(shù)據(jù)源和連接池的關(guān)系:

            JDBC2.0提供了javax.sql.DataSource接口,它負責(zé)建立與數(shù)據(jù)庫的連接,在應(yīng)用程序訪問數(shù)據(jù)庫時不需要編寫連接數(shù)據(jù)庫的代碼,可以直接從數(shù)據(jù)源獲得數(shù)據(jù)庫連接。
           
            在DataSource中事先建立了多個數(shù)據(jù)庫連接,這些數(shù)據(jù)庫連接保存在連接池(Connect Pool)中。Java程序訪問數(shù)據(jù)庫時,只需要從連接池中取出空閑狀態(tài)的數(shù)據(jù)庫連接;當(dāng)程序訪問數(shù)據(jù)庫結(jié)束,再將數(shù)據(jù)庫連接放回連接池。


            四、數(shù)據(jù)源和JNDI的關(guān)系:

            DataSource對象是由Tomcat提供的,因此不能在程序中采用創(chuàng)建一個實例的方式來生產(chǎn)DataSource對象,而需要采用Java的另一個技術(shù)JNDI,來獲得DataSource對象的引用。

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

            在javax.naming包中提供了Context接口,該接口提供了將對象和名字綁定,以及通過名字檢索對象的方法。Context中的主要方法有:

            bind(String name,Object object):將對象與一個名字綁定
            lookup(String name):返回與指定的名字綁定的對象

          五、Tomcat中數(shù)據(jù)源的配置:

            數(shù)據(jù)源的配置涉及修改server.xml和web.xml,在server.xml中加入定義數(shù)據(jù)源的元素,在web.xml加入元素,聲明該Web應(yīng)用所引用的數(shù)據(jù)。

            A.在server.xml中加入元素:元素用來定義JNDI Resource。
            
            屬性    描述
            name    指定Resource的JNDI名字
            auth    指定管理Resource的Manager,它有兩個可選值:Container、Application
            type    指定Resource所屬的Java類名

           

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

            B.在元素中加入元素:元素用來指定各種參數(shù)值
            
            屬性      描述
            factory    指定生成的DataResource的factory類名
            maxActive    指定數(shù)據(jù)庫連接池中處于活動狀態(tài)的最大連接數(shù)目,0表示不受限制
            maxIdle    指定數(shù)據(jù)庫連接池中處于空閑狀態(tài)的最大連接數(shù)目,0表示不受限制
            maxWait    指定連接池中連接處于空閑狀態(tài)的最長時間,超過會拋出異常,-1表示無限
            username    指定連接數(shù)據(jù)庫的用戶名
            password    指定連接數(shù)據(jù)庫的口令
            driverClassName    指定連接數(shù)據(jù)庫的JDBC驅(qū)動程序
            url  指定連接數(shù)據(jù)庫的URL

          <ResourceParams name = "jdbc/BookDb"> <parameter> <name>factoryname> <value>org.apache.commons.dbcp.BasicDataSourceFactoryvalue> parameter> <parameter> <name>maxActivename> <value>100value> parameter> <parameter> <name>maxIdlename> <value>30value> parameter> <parameter> <name>maxWaitname> <value>10000value> parameter> <parameter> <name>usernamename> <value>uservalue> parameter> <parameter> <name>passwordname> <value>1234value> parameter> <parameter> <name>driverClassNamename> <value>com.mysql.jdbc.Drivervalue> parameter> <parameter> <name>urlname> <value>jdbc:mysql//localhost:3306/BookDb?autoReconnect=true parameter> ResourceParams>

           

            C.在web.xml中加入元素:元素表示在Web應(yīng)用中引用JNDI資源
            
            屬性      描述
            description    對所引用的資源的說明
            res-ref-name    指定所引用資源的JNDI名字,與元素中的name屬性對應(yīng)
            res-type  指定所引用資源的類名字,與元素中的type屬性對應(yīng)
            res-auth  指定所引用資源的Manager,與元素中的auth屬性對應(yīng)


            六、在Web應(yīng)用中使用數(shù)據(jù)源:

            javax.naming.Context提供了查找JNDI Resource的接口,可以通過三個步驟來使用數(shù)據(jù)源對象:

            A.獲得對數(shù)據(jù)源的引用:

           

              Context ctx = new InitalContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/BookDb");

            B.獲得數(shù)據(jù)庫連接對象:

          Connection con = ds.getConnection();

            C.返回數(shù)據(jù)庫連接到連接池:

          con.close();

           

            在連接池中使用close()方法和在非連接池中使用close()方法的區(qū)別是:前者僅僅是把數(shù)據(jù)庫連接對象返回到數(shù)據(jù)庫連接池中,是連接對象又恢復(fù)到空閑狀態(tài),而非關(guān)閉數(shù)據(jù)庫連接,而后者將直接關(guān)閉和數(shù)據(jù)庫的連接。


            七、發(fā)布使用數(shù)據(jù)源的Web應(yīng)用:

            如果直接同JDBC訪問數(shù)據(jù)庫,可以把JDBC驅(qū)動程序拷貝到Web應(yīng)用的WEB-INF/lib目錄或者Tomcat安裝目錄下的common/lib目錄下。
            
            如果通過數(shù)據(jù)源訪問數(shù)據(jù)庫,由于數(shù)據(jù)源由Servlet容器創(chuàng)建并維護,所以必須把JDBC驅(qū)動程序拷貝到Tomcat安裝目錄下的common/lib目錄下,確保Servlet容器能夠訪問驅(qū)動程序。

          ------------
           八.在WEB中應(yīng)用JNDI訪問數(shù)據(jù)源
          --java:comp/env是TOMCAT 固定的,Tomcat提供的JNDI綁定都必須加此前綴,
          --jdbc/dstest 是定義數(shù)據(jù)源時的數(shù)據(jù)名
           final String JNDINAME ="java:comp/env/jdbc/dstest";
           Context  ctx = new InitalContext();
           DataSource ds = (DataSource)ctx.lookup(JNDINAME);
           Connection conn = ds.getConnection();
           Statement stmt=conn.createrStatement();
           ResultSet rs = stmt.executeQuery( "sql 語句");
           while(rs.next)
           {}
          ---------
          可通過修改server.xml文件來進行配置全局數(shù)據(jù)源,配置方式與局部數(shù)據(jù)源類似,只是修改的文件不同.
          局部數(shù)據(jù)源只需要修改web應(yīng)用的配置文件,而全局數(shù)據(jù)源需要修改Tomcat的系統(tǒng)文件.
          一般盡量不使用全局數(shù)據(jù)源.
            
          主站蜘蛛池模板: 东平县| 中牟县| 封丘县| 来安县| 渭南市| 九龙县| 游戏| 广平县| 伊宁市| 寿光市| 东海县| 辉南县| 福海县| 新建县| 巴林左旗| 华阴市| 德化县| 阜康市| 永嘉县| 图木舒克市| 沿河| 桦川县| 汝州市| 九龙县| 新竹市| 斗六市| 东乌珠穆沁旗| 秦皇岛市| 邹平县| 新安县| 焦作市| 四会市| 义马市| 龙门县| 长汀县| 五原县| 洪雅县| 荣昌县| 聊城市| 乌鲁木齐县| 阳原县|