心的方向

          新的征途......
          posts - 75,comments - 19,trackbacks - 0
           

          tomcat的數據庫連接池的配置

          環境:
          1.
          數據庫:mysql
          2.
          數據庫驅動程序:org.gjt.mm.mysql.Driver
          JNDI
          Java Naming and Directory Interface)概述:
          Tomcat4
          5)提供了一個與Java Enterprise Edition應用服務相兼容的JNDI--InitialContext實現實例。它的初始數據設置在$CATALINA_HOME/conf/server.xml文件里,并可能在網頁應用環境描述(/WEB-INF/web.xml)里被下列元素引用:
          1) --
          環境入口,設置應用程序如何操作。
          2) --
          資源參數,一般是數據庫驅動程序、JavaMail Session、自定義類工廠等。
          3) --
          Servlet 2.4里用來簡化設置不需認證信息的資源資源如環境參數、resource-ref變量。
          InitialContext
          在網頁應用程序初始化時被設置,用來支持網頁應用程序組件。所有的入口和資源都放在JNDI命名空間里的java:comp/env段里。點擊下列網址以獲取更多信息:
          1) Java
          命名和目錄接口(Java Naming and Directory Interface
          2) J2EE
          平臺說明(J2EE Platform Specification
          設置JNDI資源
          設置JNDI資源要在$CATALINA_HOME/conf/server.xml文件里使用下列標志符:
          1) --
          設置域個可變的JNDI InitialContext入口的名字和值(同上面說的等價)。
          2) --
          設置應用程序可用的資源的名字和類型(同上面說的等價)。
          3) --
          設置Java資源類工廠的名稱或將用的JavaBean屬性。
          4) --
          給全局JNDI環境(JNDI Context)添加一個鏈接。
          上述這些標志符必須放在和之間(針對專門的網頁應用程序)或和之間。
          此外,設在網頁應用環境描述(Web Application Descriptor)(/WEB-INF/web.xml)里的名字和值也在初始環境(Initial Context)里被設置,當被元素值允許時將被重設初始值。
          全局變量能在子元素的里設置。
          數據庫連接池概述:
          數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫連接池正是針對這個問題提出來的。
          數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
          數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。數據庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素:
          1)
          最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費;
          2)
          最大連接數是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求將被加入到等待隊列中,這會影響之后的數據庫操作。
          3)
          如果最小連接數與最大連接數相差太大,那么最先的連接請求將會獲利,之后超過最小連接數量的連接請求等價于建立一個新的數據庫連接。不過,這些大于最小連接數的數據庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時后被釋放。
          配置Tomcat數據庫連接池的前提:
          1.
          必須裝有Java運行環境;
          2. mysql

          $CATALINA_HOME/conf/server.xml里設置數據庫連接池:
          下面是配置的代碼,必須放在和之間。



           
            maxActive
           
            100
           
           
            maxIdle
           
            30
           
           
            maxWait
           
            10000
           
           
            removeAbandoned
           
            true
           
           
            removeAbandonedTimeout
           
            60
           
           
            logAbandoned
           
            false
           
           
            factory
           
            org.apache.commons.dbcp.BasicDataSourceFactory
           
           
            username
           
            root
           
           
            password
           
           
           
           
            driverClassName
           
            org.gjt.mm.mysql.Driver
           
           
            url
           
            jdbc:mysql://localhost/test
           


          下面是一些參數的說明:

          其中:
          1) path 
          指定路徑,這里設定的是$CATALINA_HOME/webapps下的test目錄;
          2) docBase
          文件根目錄。
          3) reloader 
          當網頁被更新時是否重新編譯。
          4) maxActive
          連接池的最大數據庫連接數。設為0表示無限制。
          5) maxIdle 
          數據庫連接的最大空閑時間。超過此空閑時間,數據庫連接將被標記為不可用,然后被釋放。設為0表示無限制。
          6) maxWait
          最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示無限制。
          7) removeAbandoned
          回收被遺棄的(一般是忘了釋放的)數據庫連接到連接池中。
          8) removeAbandonedTimeout
          數據庫連接過多長時間不用將被視為被遺棄而收回連接池中。
          9) logAbandoned
          將被遺棄的數據庫連接的回收記入日志。
          10) driverClassName JDBC
          驅動程序。
          11) url  
          數據庫連接字符串
          $CATALINA_HOME/webapps/test/WEB-INF/web.xml里設置被引用的資源:
          下面是配置代碼,必須放在和里。


          connectDB test
          jdbc/connectDB
          javax.sql.DataSource
          Container


          下面是一下參數的必要說明:
          1) description 
          對被引用的資源的描述。
          2) res-ref-name 
          資源名稱。見上面的
          3) res-type 
          資源類型。見上面的
          為了方便做解釋直接在JSP中使用資源:
          這是在$CATALINA_HOME/webapps/test下的某級子目錄里的jsp網頁文件部分代碼:


          代碼說明:
          DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");
          上面這句應用了剛才設的資源。
          資源使用完要釋放,尤其是Context資源,見try-catch-finally部分的finally代碼段,這是一種好的習慣。資源釋放時如果釋放了上級資源,下級資源將先被釋放。如:釋放了ctx,那么資源釋放順序將是rsstmtcnnctx。換句話說,如果釋放了ctx,那么rsstmtcnn都將不可用了。
          這里的釋放資源只是將數據庫連接返回連接池中,并不是把資源真正釋放掉,見數據庫連接池概述。

           

          Datasource對象是由Tomcat提供的,因而需要使用JNDI來獲得Datasouce

          Javax.naming 中提供了Context接口,

          數據源的配置涉及到Server.xmlweb.xml,需要在server.xml中加入如下內容:說明一下:我的數據庫是MYsql


                                   type="javax.sql.DataSource"/>
                    \\
          數據源的名稱
                      usernameroot
          數據庫的名稱
                      passwordpassword
          數據庫密碼
                      driverClassName
                        org.gjt.mm.mysql.Driver\\
          要加載的驅動
                      url
                        jdbc:mysql://172.20.0.73/rk?\\
          要連接的URL
                   
                   
            

          具體還有一些詳細的選項例如:MaxActive等,參加Server.xml中說明

          另外在Web.xml中加入如下內容:
          test connection\\
          描述
              jdbc/testDB\\
          名稱與上對應
              javax.sql.DataSource\\
          與上對應
              Container\\
          與上一置
             

          配置以上內容后,只要在你的JspJavabean 中按以下方式創建連接,就可以

          Context ctx=new InitialContext();
            DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/testDB");
            conn = ds.getConnection();

          以上代碼均測試成功,但是在Server.xml中配置數據庫的URL中我不能加入useUnicode=true&characterEncoding=GBK,所以從數據庫中取出來的漢字都是????

          我用如下代碼來解決這個問題:

          public static String toChinese(String strvalue) {
            try{
             if(strvalue==null)
            {
            return null;
            }
            else {
             strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
             return strvalue;
            }
            }catch(Exception e){
             return null;
            }
           }

          Step by Step
          1。將數據庫驅動程序拷貝到tomcat\common\lib目錄下面。
          2
          。修改server.xml文件,在Context配置節點下面加上資源節點,如下:
                           maxActive="100" maxIdle="30" maxWait="10000"
                           username="root" password="" driverClassName="org.gjt.mm.mysql.Driver"
                           url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK&useUnicode=TRUE"/>
                 
          注意的是:如果有&字符,需要轉移成&XML文件規范)
          3
          。修改Web應用WEB-INF\web.xml文件,加上Resource-Def,如下:
           
                DB Connection
                jdbc/TestDB
                javax.sql.DataSource
                Container
           
          4
          。重新啟動Web應用,在Web應用中可以通過下面的代碼來獲取數據源和數據庫連接:
          javax.naming.InitialContext context = new javax.naming.InitialContext();
          DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/TestDB" );
          connection = (Connection)ds.getConnection();

          Problem And Answer
          1
          Question:如果出現下列提示:
                javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
                  at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640)
          ,怎么辦?
                Answer
          :檢查在Tomcatconf/server.xml文件,檢查是否設置useNaming="false",如果是,去掉。
          2
          Question:如果無法找到數據庫驅動程序怎么辦?
                Answer
          :檢查數據庫驅動JDBC程序是否放在了Tomcat\common\lib目錄下面

           

          posted on 2007-12-06 10:16 阿偉 閱讀(360) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 通辽市| 察雅县| 蕉岭县| 桃源县| 邻水| 辽阳市| 石台县| 江源县| 甘肃省| 汶川县| 祁门县| 腾冲县| 凤台县| 宁海县| 大兴区| 承德县| 中西区| 万宁市| 岳西县| 棋牌| 武清区| 射洪县| 枣庄市| 福州市| 交城县| 镇康县| 胶南市| 涞水县| 剑阁县| 克拉玛依市| 武山县| 锡林郭勒盟| 景洪市| 龙州县| 海原县| 昭觉县| 集贤县| 张北县| 海安县| 兰溪市| 五常市|