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

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

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

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

    tomcat服務(wù)器連接池知識(shí)

    tomcat服務(wù)器連接池知識(shí)  

    什么是敏捷開(kāi)發(fā)

    簡(jiǎn)單的說(shuō),敏捷開(kāi)發(fā)是一種以人為核心、迭代、循序漸進(jìn)的開(kāi)發(fā)方法。在敏捷開(kāi)發(fā)中,軟件項(xiàng)目的構(gòu)建被切分成多個(gè)子項(xiàng)目,
    各個(gè)子項(xiàng)目的成果都經(jīng)過(guò)測(cè)試,具備集成和可運(yùn)行的特征。換言之,就是把一個(gè)大項(xiàng)目分為多個(gè)相互聯(lián)系,但也可獨(dú)立運(yùn)行的小項(xiàng)目,
    并分別完成,在此過(guò)程中軟件一直處于可使用狀態(tài)。

    Tomcat中配置連接池步驟

    本方法的原理是,在%CATALINA%\conf\server.xml中設(shè)置數(shù)據(jù)庫(kù)的連接屬性,
    在應(yīng)用目錄的/WEB-INF/web.xml中配置一個(gè)引用,
    然后在應(yīng)用中的/META-INF/context.xml中將以上兩個(gè)配置聯(lián)系起來(lái)。
    所以真正產(chǎn)生連接的是tomcat系統(tǒng)級(jí),因此數(shù)據(jù)庫(kù)驅(qū)動(dòng)應(yīng)該放在%CATALINA%\common\lib中

    以下是具體步驟:

    1.將數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的JAR文件放在Tomcat的 common/lib 中。

    2.在server.xml中設(shè)置數(shù)據(jù)源,以MySQL數(shù)據(jù)庫(kù)為例,如下:
    在<GlobalNamingResources> </GlobalNamingResources>節(jié)點(diǎn)中加入,
      <Resource
      name="jdbc/DBPool"
      type="javax.sql.DataSource"
      password="root"
      driverClassName="com.mysql.jdbc.Driver"
      maxIdle="2"
      maxWait="5000"
      username="root"
      url="jdbc:mysql://127.0.0.1:3306/test"
      maxActive="4"/>
      屬性說(shuō)明:name,數(shù)據(jù)源名稱,通常取”jdbc/XXX”的格式;
      type,”javax.sql.DataSource”;
      password,數(shù)據(jù)庫(kù)用戶密碼;
      driveClassName,數(shù)據(jù)庫(kù)驅(qū)動(dòng);
      maxIdle,最大空閑數(shù),數(shù)據(jù)庫(kù)連接的最大空閑時(shí)間。超過(guò)空閑時(shí)間,數(shù)據(jù)庫(kù)連
      接將被標(biāo)記為不可用,然后被釋放。設(shè)為0表示無(wú)限制。
      MaxActive,連接池的最大數(shù)據(jù)庫(kù)連接數(shù)。設(shè)為0表示無(wú)限制。
      maxWait ,最大建立連接等待時(shí)間。如果超過(guò)此時(shí)間將接到異常。設(shè)為-1表示
      無(wú)限制。

    3.在你的web應(yīng)用程序的web.xml中設(shè)置數(shù)據(jù)源參考,如下:
      在<web-app></web-app>節(jié)點(diǎn)中加入,
      <resource-ref>
      <description>MySQL DB Connection Pool</description>
      <res-ref-name>jdbc/DBPool</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
      <res-sharing-scope>Shareable</res-sharing-scope>
     </resource-ref>
      子節(jié)點(diǎn)說(shuō)明: description,描述信息;
      res-ref-name,參考數(shù)據(jù)源名字,同上一步的屬性name;
      res-type,資源類型,”javax.sql.DataSource”;
      res-auth,”Container”;
      res-sharing-scope,”Shareable”;

    4.在web應(yīng)用程序的/META-INF/context.xml中設(shè)置數(shù)據(jù)源鏈接,如下:
      在<Context></Context>中加入:
      <Context>
      <ResourceLink
      name="jdbc/DBPool" 
      type="javax.sql.DataSource" 
      global="jdbc/DBPool"/>
      </Context>
      屬性說(shuō)明:name,同第2步和第3步的屬性name值,和子節(jié)點(diǎn)res-ref-name值;
      type,同樣取”javax.sql.DataSource”;
      global,同name值。
     
    至此,設(shè)置完成,下面是如何使用數(shù)據(jù)庫(kù)連接池。
    1.建立一個(gè)連接池類,DBPool.java,用來(lái)創(chuàng)建連接池,代碼如下:
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;

    public class DBPool {
      private static DataSource pool;
      static {
      Context env = null;
      try {
      env = (Context) new InitialContext().lookup("java:comp/env");
      pool = (DataSource)env.lookup("jdbc/DBPool");
      if(pool==null) 
      System.err.println("'DBPool' is an unknown DataSource");
      } catch(NamingException ne) {
      ne.printStackTrace();
      }
      }
      public static DataSource getPool() {
      return pool;
      }
    }

    2.在要用到數(shù)據(jù)庫(kù)操作的類或jsp頁(yè)面中,用DBPool.getPool().getConnection(),
    獲得一個(gè)Connection對(duì)象,就可以進(jìn)行數(shù)據(jù)庫(kù)操作,最后別忘了對(duì)Connection對(duì)象調(diào)用close()方法,
    注意:這里不會(huì)關(guān)閉這個(gè)Connection,而是將這個(gè)Connection放回?cái)?shù)據(jù)庫(kù)連接池。

    數(shù)據(jù)源和數(shù)據(jù)庫(kù)共享連接池關(guān)系

    一、數(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接口的類,要使用數(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è)邏輯名稱來(lái)引用它,
    JNDI會(huì)自動(dòng)根據(jù)你給出的名稱找到與這個(gè)名稱綁定的DataSource對(duì)象。然后就可以使用這個(gè)DataSource對(duì)象來(lái)建立和具體數(shù)據(jù)庫(kù)的連接了。

    其次,使用實(shí)現(xiàn)了DataSource接口的類所具有的第二個(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è)非常重要的角色,它能夠在眾多的用戶、機(jī)器、網(wǎng)絡(luò)、服務(wù)、應(yīng)用程序中訪問(wèn)各種各樣的信息。
    目錄服務(wù)提供了一系列的命名措施,用人類可以理解的命名方式來(lái)刻畫各種各樣的實(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ū)分不同的部門或組織。而這些部門或組織自己又可以使用諸如LADP或NDS的目錄服務(wù)

    從用戶的角度來(lái)看,這些都是由不同的命名方案構(gòu)成的復(fù)合名稱。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程序查找和獲取任何類型的對(duì)象

    終端用戶可以方便地使用邏輯名稱從而輕易地在網(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í)不需要編寫連接數(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ù)源的元素<Resource>,在web.xml加入<resource-ref>元素,聲明該Web應(yīng)用所引用的數(shù)據(jù)


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

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

    B.在<Resource>元素中加入<ResourceParams>元素:<ResourceParams>元素用來(lái)指定各種參數(shù)值
      
    屬性    描述
    factory    指定生成的DataResource的factory類名
    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ù)的用戶名
    password    指定連接數(shù)據(jù)庫(kù)的口令
    driverClassName    指定連接數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序
    url             指定連接數(shù)據(jù)庫(kù)的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應(yīng)用中引用JNDI資源
      
    屬性                  描述
    description    對(duì)所引用的資源的說(shuō)明
    res-ref-name    指定所引用資源的JNDI名字,與<Resource>元素中的name屬性對(duì)應(yīng)
    res-type             指定所引用資源的類名字,與<Resource>元素中的type屬性對(duì)應(yīng)
    res-auth             指定所引用資源的Manager,與<Resource>元素中的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)程序。


    數(shù)據(jù)庫(kù)連接池的主要操作如下:
      
      (1)建立數(shù)據(jù)庫(kù)連接池對(duì)象(服務(wù)器啟動(dòng))。
      
      (2)按照事先指定的參數(shù)創(chuàng)建初始數(shù)量的數(shù)據(jù)庫(kù)連接(即:空閑連接數(shù))。
      
      (3)對(duì)于一個(gè)數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求,直接從連接池中得到一個(gè)連接。假如數(shù)據(jù)庫(kù)連接池對(duì)象中沒(méi)有空閑的連接,且連接數(shù)沒(méi)有達(dá)到最大(即:最大活躍連接數(shù)),創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接。
      
      (4)存取數(shù)據(jù)庫(kù)。
      
      (5)關(guān)閉數(shù)據(jù)庫(kù),釋放所有數(shù)據(jù)庫(kù)連接(此時(shí)的關(guān)閉數(shù)據(jù)庫(kù)連接,并非真正關(guān)閉,而是將其放入空閑隊(duì)列中。如實(shí)際空閑連接數(shù)大于初始空閑連接數(shù)則釋放連接)。
      
      (6)釋放數(shù)據(jù)庫(kù)連接池對(duì)象(服務(wù)器停止、維護(hù)期間,釋放數(shù)據(jù)庫(kù)連接池對(duì)象,并釋放所有連接)。

    posted on 2012-05-23 10:59 順其自然EVO 閱讀(659) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

    <2012年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲熟妇无码av另类vr影视| 6080午夜一级毛片免费看| 亚洲一级视频在线观看| 亚洲国产精品国自产拍AV| 亚洲精品乱码久久久久久下载| 亚洲精品亚洲人成在线观看下载| 可以免费看的卡一卡二| 久久国产色AV免费看| 免费无码又爽又刺激网站| 青娱乐在线免费观看视频| 亚洲AV性色在线观看| 亚洲欧洲精品成人久久曰| 亚洲综合色区中文字幕| 亚洲视频免费观看| 亚洲a在线视频视频| 国产v亚洲v天堂无码网站| 亚洲精品久久久www| 亚洲Av无码乱码在线znlu| 国产福利免费在线观看| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲乱码日产一区三区| 免费在线观看毛片| 四虎永久免费网站免费观看| 成熟女人特级毛片www免费| 毛片免费视频播放| 无码免费午夜福利片在线 | 亚洲国产精品国自产拍电影| 国产亚洲精AA在线观看SEE| 亚洲精品无码精品mV在线观看| 中文字幕亚洲激情| 伊人久久大香线蕉亚洲五月天 | 亚洲第一视频在线观看免费| 男女交性无遮挡免费视频| 黄色片网站在线免费观看| 精品特级一级毛片免费观看| 亚洲蜜芽在线精品一区| 亚洲精品中文字幕麻豆| 亚洲三级在线播放| 四虎亚洲精品高清在线观看| 亚洲爆乳精品无码一区二区| 亚洲AV成人一区二区三区观看 |