<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    天若有情

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

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

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

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

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

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

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

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

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


      二、JNDI簡(jiǎn)介:

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

     

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

      B.在元素中加入元素:元素用來(lái)指定各種參數(shù)值
      
      屬性      描述
      factory    指定生成的DataResource的factory類(lèi)名
      maxActive    指定數(shù)據(jù)庫(kù)連接池中處于活動(dòng)狀態(tài)的最大連接數(shù)目,0表示不受限制
      maxIdle    指定數(shù)據(jù)庫(kù)連接池中處于空閑狀態(tài)的最大連接數(shù)目,0表示不受限制
      maxWait    指定連接池中連接處于空閑狀態(tài)的最長(zhǎng)時(shí)間,超過(guò)會(huì)拋出異常,-1表示無(wú)限
      username    指定連接數(shù)據(jù)庫(kù)的用戶(hù)名
      password    指定連接數(shù)據(jù)庫(kù)的口令
      driverClassName    指定連接數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序
      url  指定連接數(shù)據(jù)庫(kù)的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    對(duì)所引用的資源的說(shuō)明
      res-ref-name    指定所引用資源的JNDI名字,與元素中的name屬性對(duì)應(yīng)
      res-type  指定所引用資源的類(lèi)名字,與元素中的type屬性對(duì)應(yīng)
      res-auth  指定所引用資源的Manager,與元素中的auth屬性對(duì)應(yīng)


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

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

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

     

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

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

    Connection con = ds.getConnection();

      C.返回?cái)?shù)據(jù)庫(kù)連接到連接池:

    con.close();

     

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


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

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

    ------------
     八.在WEB中應(yīng)用JNDI訪問(wèn)數(shù)據(jù)源
    --java:comp/env是TOMCAT 固定的,Tomcat提供的JNDI綁定都必須加此前綴,
    --jdbc/dstest 是定義數(shù)據(jù)源時(shí)的數(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 語(yǔ)句");
     while(rs.next)
     {}
    ---------
    可通過(guò)修改server.xml文件來(lái)進(jìn)行配置全局?jǐn)?shù)據(jù)源,配置方式與局部數(shù)據(jù)源類(lèi)似,只是修改的文件不同.
    局部數(shù)據(jù)源只需要修改web應(yīng)用的配置文件,而全局?jǐn)?shù)據(jù)源需要修改Tomcat的系統(tǒng)文件.
    一般盡量不使用全局?jǐn)?shù)據(jù)源.
      
    主站蜘蛛池模板: 亚洲国产成人精品激情| 久久国产乱子伦精品免费一| 久久亚洲国产欧洲精品一| 最新猫咪www免费人成| 在线毛片片免费观看| 日韩在线视精品在亚洲| 亚洲人成激情在线播放| 国产亚洲婷婷香蕉久久精品| 在线观着免费观看国产黄| 1000部拍拍拍18勿入免费视频下载| www永久免费视频| 亚洲av最新在线观看网址| 亚洲成人黄色在线| 国产AV无码专区亚洲AV毛网站| 日韩精品电影一区亚洲| 精品久久久久成人码免费动漫| 久久精品国产这里是免费| 2022国内精品免费福利视频| 日韩亚洲人成网站| 91在线亚洲综合在线| 亚洲福利视频网址| 亚洲国产老鸭窝一区二区三区| 亚洲乳大丰满中文字幕| 亚洲第一区在线观看| 四虎永久在线精品免费观看地址| 欧美在线看片A免费观看| 久久www免费人成看片| 69影院毛片免费观看视频在线| 国偷自产一区二区免费视频| 成人网站免费大全日韩国产| 又黄又大的激情视频在线观看免费视频社区在线 | 亚洲图片激情小说| 久久亚洲sm情趣捆绑调教| 亚洲av伊人久久综合密臀性色| 亚洲熟妇无码另类久久久| 亚洲色一色噜一噜噜噜| 免费观看四虎精品国产永久| 国产成人综合久久精品免费| 精品久久久久久久免费人妻| 国产精品视频免费一区二区三区| 性感美女视频免费网站午夜|