tinguo002

           

          Tomcat6.0 連接池的配置

           Tomcat6.0 連接池的配置

          1.本人當前使用的Tomcat版本為:6.0.20,oracle為穩定的9i版本

          2.下文為方便起見,依習慣以%Tomcat_Home%表示Tomcat安裝的目錄,本人安裝目錄為“E:\Program Files\WindowsXP\tomcat6”

          配置步驟如下:

          1.Tomcat 6的配置和以前的不同了,不推薦在server.xml中進行配置,而是在%Tomcat_Home%\webapps\yourApp\META-INF \context.xml中進行配置才是更好的方法。而不是以前版本%Tomcat_Home%\conf下的context.xml文件。這樣就可以在不同的web應用下單獨配置連接池了,且Tomcat會自動重載。當然你也可以更改%Tomcat_Home%\conf下的context.xml文件,將所有web應用下的連接池進行統一配置。

          2.將代碼修改如下:

          view plaincopy to clipboardprint?
          <Context reloadable="true"> 
              <WatchedResource>WEB-INF/web.xml</WatchedResource> 
              <Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"   
              maxActive="100"   
              maxIdle="30" 
              maxWait="10000" 
              username="scott"   
              password="tiger" 
              driverClassName="oracle.jdbc.driver.OracleDriver" 
              url="jdbc:oracle:thin:@localhost:1521:ora9"/> 
          </Context> 
          <Context reloadable="true">
              <WatchedResource>WEB-INF/web.xml</WatchedResource>
           <Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"
           maxActive="100"
           maxIdle="30"
           maxWait="10000"
           username="scott"
           password="tiger"
           driverClassName="oracle.jdbc.driver.OracleDriver"
           url="jdbc:oracle:thin:@localhost:1521:ora9"/>
          </Context>

          name 為當前數據源JNDI的名字,可以隨意設定;

          auth 為驗證方式;

          type 資源類型;

          driverClassName 為Oracle驅動引用;

          maxActiv 為連接池最大激活的連接數,設為0表示無限制;

          maxIdle 表示即使沒有數據庫連接時依然可以保持30個空閑的連接,而不被清除,隨時處于待命狀態。設為0表示無限制;

          maxWait 為連接最大的等待時間,單位毫秒,取值10000,表示10000秒后超時。設為-1

                        表示無限制。;

          username 為oracle數據庫的一個用戶名;

          password 為username的密碼;

          url 為連接oracle的連接地址;

          注:本人嘗試將代碼“driverClassName="oracle.jdbc.driver.OracleDriver"”改為“driverClassName="oracle.jdbc.OracleDriver"”程序依然運行正常,剛開始以為老師的代碼有問題

          3.在程序中的調用形式為:

          view plaincopy to clipboardprint?
          Context context = new InitialContext();  
          DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");  
          Connection conn = ds.getConnection(); 
          Context context = new InitialContext();
          DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");
          Connection conn = ds.getConnection();

          注:“java:/comp/env/jdbc/oracleds”紅色標記文字為步驟1里設置的Resource name

          則可以將建立connection的方式以上述形式取代傳統方式:

          view plaincopy to clipboardprint?
          String driver = "oracle.jdbc.driver.OracleDriver";  
          String url = "jdbc:oracle:thin:@localhost:1521:ora9";  
          String username = "scott";  
          String password = "tiger";  
          Class.forName(driver);  
          Connection conn = DriverManager.getConnection(url, username, password); 
          String driver = "oracle.jdbc.driver.OracleDriver";
          String url = "jdbc:oracle:thin:@localhost:1521:ora9";
          String username = "scott";
          String password = "tiger";
          Class.forName(driver);
          Connection conn = DriverManager.getConnection(url, username, password);

          4.另外還需將用到的jdbc驅動類庫導入到%Tomcat_Home%\lib目錄下

          否則會拋出如下異常:
          org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'

          依上述步驟就能成功的配置Tomcat6.0 連接池,還有網友貼文說需

          在web.xml文件中的web-app節點下加入如下代碼形式:
          <resource-ref>
          <res-ref-name>jdbc/myoracle</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          </resource-ref>

          因本人未添加此項,程序依然正確,故本人認為此步驟為非必要項

           ---------------------------------------------------------------------------

          今天需要在另一臺機器上重新部署系統,重新設置db的連接池。當我把tomcat拷貝到那臺機器,并且修改META-INF\context.xml,然后重新啟動tomcat,但發現系統連接的仍然是老的db。再次檢查了META-INF\context.xml文件,確信了這個文件已經正確設置db連接了,這也說明這個文件并沒有真正起作用。查看了tomcat下conf\context.xml也沒有設置db的連接池。那是哪個文件在起作用呢?折騰了辦法,后來發現tomcat在conf\Catalina\localhost下生成了一個和原來META-INF\context.xml相同內容的文件,懷疑一定是這個文件在起作用?刪除conf\Catalina\localhost目錄,重啟tomcat,問題消失。

          轉載一篇tomcat加載類的順序

           

           

          bin:存放啟動和關閉tomcat的腳本文件; 

          /conf:存放tomcat的各種配置文件,比如:server.xml 

          /server/lib:存放tomcat服務器所需要的各種jar文件(jar文件只可被tomcat 服務器訪問) 

          /server/webapps:存放tomcat自帶的兩個web應用:admin應用和manager應用。 

          /common/lib:存放tomcat服務器以及所有web應用都可以訪問的jar文件夾(web和tomcat服務器都可訪問此jar) 

          /shared/lib:存放web都可訪問的jar文件。(可以被所有的web訪問,但不能被tomcat訪問) 

          /logs:存放tomcat的日志文件 

          /webapps:當發布web應用時,默認情況下把web應用文件放于此目錄下 

          /work:tomcat把由jsp生成的Servlet放于此目錄 

          另:在web應用中,WEB-Inf目錄下,也可以建立lib子目錄,在此子目錄下可以存放各種jar文件,這些jar文件只能被當前web應用訪問。其中,在web-inf目錄下的lib與classes目錄,Tomcat類裝載器先裝載classes目錄下的類,再裝載lib目錄下的類。因為類同名時,classes優先。 

           

          其中jsp運行時,查找class的順序為:項目文件夾(WEB-INF\lib)===》容器文件夾(tomcat\common\lib)==》jdk文件夾(jdk\jre\lib\ext) 

           

          Tomcat的class加載的優先順序一覽 

          1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。 

          2.環境變量CLASSPATH中的jar和class文件。 

          3.$CATALINA_HOME/common/classes下的class文件。 

          4.$CATALINA_HOME/commons/endorsed下的jar文件。 

          5.$CATALINA_HOME/commons/i18n下的jar文件。 

          6.$CATALINA_HOME/common/lib 下的jar文件。 

          (JDBC驅動之類的jar文件可以放在這里,這樣就可以避免在server.xml配置好數據源卻出現找不到JDBC Driver的情況。) 

          7.$CATALINA_HOME/server/classes下的class文件。 

          8.$CATALINA_HOME/server/lib/下的jar文件。 

          9.$CATALINA_BASE/shared/classes 下的class文件。 

          10.$CATALINA_BASE/shared/lib下的jar文件。 

          11.各自具體的webapp /WEB-INF/classes下的class文件。 

          12.各自具體的webapp /WEB-INF/lib下的jar文件。 

           

          class的搜尋順序如下 

          ------------- 

          /WEB-INF/classes of your web application 

          /WEB-INF/lib/*.jar of your web application 

          $CATALINA_HOME/common/classes 

          $CATALINA_HOME/common/endorsed/*.jar 

          $CATALINA_HOME/common/i18n/*.jar 

          $CATALINA_HOME/common/lib/*.jar 

          $CATALINA_BASE/shared/classes 

          $CATALINA_BASE/shared/lib/*.jar 

          -------------- 

          因此放在不同webapp里的class文件,會被classloader加載成不同的實例。 

          例如假設下面兩個不同內容的class。分別放在不同的webapp的class目錄下。 

          package com.lizongbo; 

          public class TestClass { 

            private String NAME="lizongbo"; 

           

          package com.lizongbo; 

          public class TestClass { 

            private String NAME="li_zongbo"; 

           

          在不同的webapp得到的com.lizongbo.NAME結果是不同的,且互不影響。 

          但是注意,以下包名開頭的class例外: 

          javax.* 

          org.xml.sax.* 

          org.w3c.dom.* 

          org.apache.xerces.* 

          org.apache.xalan.* 

           

          ps,注意.在各個jar中的\META-INF\MAINFEST.MF文件里Class-Path鍵值對,也會提供jar的加載優先順序。 

          例如某jar的MAINFEST.MF內容如下: 

          Manifest-Version: 1.0 

          Created-By: lizongbo 

          Class-Path: commons-beanutils.jar 

          Class-Path: commons-collections.jar 

          Class-Path: commons-dbcp.jar 

          Class-Path: commons-digester.jar 

          Class-Path: commons-logging.jar 

          Class-Path: commons-pool.jar 

          Class-Path: commons-services.jar 

          Class-Path: commons-validator.jar 

          Class-Path: jakarta-oro.jar 

          Main-Class: com.lizongbo.MyTestClass 

           

           

          那么在加載這個jar的時候,會先在此jar所在目錄下依次先加載commons-beanutils.jar,commons-collections.jar。。。等jar文件。 

           

          在不同的地方放置jar和class可能會產生意想不到的后果,,尤其是不同版本的jar文件,因此在實際應用部署web應用時候要特別留心. 

           

          例如 使用javamail常見的一個出錯信息: 

          javax.mail.NoSuchProviderException: No provider for smtp 

          其真實原因就很可能如下: 

          在不同的加載jar的目錄下放置了不同版本的mail.jar,比如一個是javamail1.3.1的mail.jar 

          在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一個是javamail1.3.2的mail.jar在 

          D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下, 

          那么lizongbo這個webapp中使用到javamail進行郵件發送的時候,便會出現No provider for smtp的錯誤。



          詳細出處參考:http://www.aygfsteel.com/gm_jing/articles/308828.html

          歡迎大家訪問我的個人網站 萌萌的IT人

          posted on 2014-06-18 14:54 一堣而安 閱讀(502) 評論(0)  編輯  收藏 所屬分類: tomcat

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 广宁县| 千阳县| 苏尼特右旗| 鹤壁市| 布拖县| 怀来县| 太湖县| 葵青区| 漳平市| 东阿县| 双牌县| 大邑县| 新田县| 庆元县| 滁州市| 汾阳市| 元朗区| 夹江县| 琼海市| 周宁县| 阿尔山市| 安泽县| 青铜峡市| 雅安市| 甘南县| 兴文县| 张家口市| 岚皋县| 长乐市| 黔江区| 河北省| 唐河县| 尖扎县| 阆中市| 疏勒县| 民和| 东丰县| 图们市| 固镇县| 江阴市| 汪清县|