qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          tomcat服務器連接池知識

          tomcat服務器連接池知識  

          什么是敏捷開發(fā)

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

          Tomcat中配置連接池步驟

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

          以下是具體步驟:

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

          2.在server.xml中設置數(shù)據(jù)源,以MySQL數(shù)據(jù)庫為例,如下:
          在<GlobalNamingResources> </GlobalNamingResources>節(jié)點中加入,
            <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"/>
            屬性說明:name,數(shù)據(jù)源名稱,通常取”jdbc/XXX”的格式;
            type,”javax.sql.DataSource”;
            password,數(shù)據(jù)庫用戶密碼;
            driveClassName,數(shù)據(jù)庫驅(qū)動;
            maxIdle,最大空閑數(shù),數(shù)據(jù)庫連接的最大空閑時間。超過空閑時間,數(shù)據(jù)庫連
            接將被標記為不可用,然后被釋放。設為0表示無限制。
            MaxActive,連接池的最大數(shù)據(jù)庫連接數(shù)。設為0表示無限制。
            maxWait ,最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示
            無限制。

          3.在你的web應用程序的web.xml中設置數(shù)據(jù)源參考,如下:
            在<web-app></web-app>節(jié)點中加入,
            <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é)點說明: description,描述信息;
            res-ref-name,參考數(shù)據(jù)源名字,同上一步的屬性name;
            res-type,資源類型,”javax.sql.DataSource”;
            res-auth,”Container”;
            res-sharing-scope,”Shareable”;

          4.在web應用程序的/META-INF/context.xml中設置數(shù)據(jù)源鏈接,如下:
            在<Context></Context>中加入:
            <Context>
            <ResourceLink
            name="jdbc/DBPool" 
            type="javax.sql.DataSource" 
            global="jdbc/DBPool"/>
            </Context>
            屬性說明:name,同第2步和第3步的屬性name值,和子節(jié)點res-ref-name值;
            type,同樣取”javax.sql.DataSource”;
            global,同name值。
           
          至此,設置完成,下面是如何使用數(shù)據(jù)庫連接池。
          1.建立一個連接池類,DBPool.java,用來創(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ù)庫操作的類或jsp頁面中,用DBPool.getPool().getConnection(),
          獲得一個Connection對象,就可以進行數(shù)據(jù)庫操作,最后別忘了對Connection對象調(diào)用close()方法,
          注意:這里不會關閉這個Connection,而是將這個Connection放回數(shù)據(jù)庫連接池。

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

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

          應用程序通過一個連接來訪問數(shù)據(jù)源,那么一個DataSource對象就是用于提供連接數(shù)據(jù)源的工具。DataSource接口提供了兩個方法用于建立和數(shù)據(jù)源的連接,
          使用DataSource對象建立和數(shù)據(jù)庫的連接比起使用DriverManager接口更加高效,雖然兩者的使用范圍都很相似,并且都提供了方法用于建立和數(shù)據(jù)庫的連接,設置連接的最大超時時間,獲取流、登錄。
            
          但兩者之間的區(qū)別更加明顯。和DriverManager不同,一個DataSource對象能夠識別和描述它所代表的數(shù)據(jù)源的屬性,
          而且 DataSource對象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的關系, DataSource的建立、發(fā)布、獨立于應用程序的管理都依靠JNDI技術。
             
          在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)在連接池和分布式事務上。連接池通過對連接的復用而不是新建一個物理連接來顯著地提高程序的效率。
          從而適用于任務繁忙、負擔繁重的企業(yè)級分布式事務。

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

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

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

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

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

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

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


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


          四、數(shù)據(jù)源和JNDI的關系:
          DataSource對象是由Tomcat提供的,因此不能在程序中采用創(chuàng)建一個實例的方式來生產(chǎn)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中數(shù)據(jù)源的配置:
          數(shù)據(jù)源的配置涉及修改server.xml和web.xml,在server.xml中加入定義數(shù)據(jù)源的元素<Resource>,在web.xml加入<resource-ref>元素,聲明該Web應用所引用的數(shù)據(jù)


          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>元素用來指定各種參數(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>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應用中使用數(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ù)庫連接池中,
          是連接對象又恢復到空閑狀態(tài),而非關閉數(shù)據(jù)庫連接,而后者將直接關閉和數(shù)據(jù)庫的連接


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


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

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

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

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 瑞昌市| 德安县| 苍南县| 庄浪县| 鲁甸县| 鄂托克前旗| 娱乐| 萍乡市| 潍坊市| 湄潭县| 华亭县| 道真| 南涧| 和顺县| 阿尔山市| 龙南县| 嘉善县| 汽车| 弥勒县| 高阳县| 延安市| 封开县| 乐清市| 金秀| 卓尼县| 利辛县| 甘孜县| 兴安盟| 丽江市| 镇宁| 江西省| 普安县| 陇川县| 康保县| 定陶县| 东方市| 囊谦县| 牡丹江市| 武隆县| 永州市| 清涧县|