Tomcat6.x+struts1.x+MySQL5.x連接池問題

          Posted on 2009-06-13 09:21 BBT_soft 閱讀(1182) 評論(5)  編輯  收藏

          1.在項目的WebRoot/META-INF下建context.xml文件,注意必須在該目錄下,Tomcat會自動找這個文件,Tomcat6.0以后就不用在web.xml中配置了:

          <?xml version="1.0" encoding="UTF-8"?>
          <Context reloadable="true" crossContext="true">

          <Resource
          name="jdbc/test" ----------注意:test為項目名
          auth="Container"----------該項為不變項
          type="javax.sql.DataSource"----------該項為不變項
          driverClassName="com.mysql.jdbc.Driver"----------數據庫驅動名
          url="jdbc:mysql://localhost:3306/haotian?autoReconnect=true"-------url
          username="root"-----用戶名
          password="root"------密碼
          maxActive="10"   ------最大連接數
          maxIdle="5"     --------最大空閑連接數
          maxWait="-1"/>   ------最大等待毫秒數,-1為無限等待

          </Context>

          2.連接類:

          public class DBConnection {
          private Connection conn=null;
          public Connection getConnection(){
            
              //生成上下文對象,通過它可以向容器發送別名.
              Context context;
              try {
               context = new InitialContext();
               //查找對象
               DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/test");//jdbc/test為配置文件中的name
               //得到連接
               try {
                conn=ds.getConnection();
               } catch (SQLException e) {
                e.printStackTrace();
               }
              } catch (NamingException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
              }
             
             
             return conn;
          }

          3.把MySQL5.0的驅動包放到Tomcat的lib目錄下,注意:是Tomcat的lib,而不是項目的lib。(不知道為什么會這樣,之前不用這種連接池的時候放在項目的lib中就可以連接成功,但是現在就不可以,個人認為可能是context.xml使得Tomcat找自身lib中的驅動包,而不是項目中的驅動包)

          4.測試:

          這里并非是在連接類里面寫個main()就可以測試成功的,如果這樣會出現下面的錯誤:

          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(Unknown Source)
          at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
          at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
          at javax.naming.InitialContext.lookup(Unknown Source)
          at util.DBConnection.getConnection(DBConnection.java:26)
          at util.DBConnection.main(DBConnection.java:49)

          所以,只有通過和前臺結合才能測試連接是否成功。

          總結:

          context.xml必須在項目的WebRoot/META-INF,Tomcat會自動找這個文件;

          數據庫驅動包必須放在Tomcat的lib目錄下(可能是Tomcat會根據context.xml在自身的lib目錄下找驅動包);

          不可以直接在連接類中寫main()測試,必須和前臺結合;

          Feedback

          # re: Tomcat6.x+struts1.x+MySQL5.x連接池問題  回復  更多評論   

          2009-06-13 10:59 by 天堂露珠
          Tomcat配置JNDI數據源:
          http://www.aygfsteel.com/wintys/archive/2009/06/12/java_tomcat_jndi_datasource.html

          # re: Tomcat6.x+struts1.x+MySQL5.x連接池問題  回復  更多評論   

          2009-06-13 14:14 by 隔葉黃鶯
          1. 驅動包放在哪里是由 Tomcat 中的類加載器層次決定的,雖然是配置在項目的 context.xml 中,但它的初始化是由 Tomcat 的 common 類加載器加載的,所以必須放在 Tomcat 的 lib 目錄中。

          2. 想在 main 方法中找到 jndi 資源,你需要考慮兩方面的事情:
          首先,那個連接池資源,未經 Tomcat 來初始化,也就沒有 bind 到 jndi 上,所以你查詢到。當然你可以手工用代碼來 bind,不需要啟動 Tomcat

          其次你在查詢連接池資源的時候,使用 InitialContext() 必須指定一個 Hashtable 參數,里面包含具體的 jndi 實現,例如 Tomcat 的 naming,具體如何指定請 google。因為在 Tomcat 容器中這些有關 JNDI 的環境變量是自動配置上的。

          3. 還有一種情況,即使由 Tomcat 來初始化的連接池,在外部單獨用 main 方法也未必能取到 Tomcat 中的 JNDI 資源,這要取決于 Tomcat 是否把資源暴露在外供其他應用程序使用。

          所以樓主還有很多東西需要深入了解,ClassLoader 和 JNDI

          # re: Tomcat6.x+struts1.x+MySQL5.x連接池問題  回復  更多評論   

          2009-06-14 00:26 by BBT_soft
          @天堂露珠
          謝謝您的指點

          # re: Tomcat6.x+struts1.x+MySQL5.x連接池問題  回復  更多評論   

          2009-06-14 00:26 by BBT_soft
          @隔葉黃鶯
          非常感謝您的指點,我是新手,還有很多東西要學

          # re: Tomcat6.x+struts1.x+MySQL5.x連接池問題  回復  更多評論   

          2009-06-16 08:59 by asdfsd
          啟動main當然會失敗,tomcat沒有啟動,數據源是tomcat提供的,所以失敗,如果你有專門的jndi服務器綁定,那就令當別論!!

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 洪洞县| 宝应县| 石景山区| 阳山县| 百色市| 郴州市| 大安市| 古丈县| 大埔县| 文昌市| 嘉黎县| 梅河口市| 沅陵县| 夏河县| 合水县| 江源县| 梨树县| 东海县| 遂川县| 齐齐哈尔市| 剑阁县| 聊城市| 嘉祥县| 阿坝| 思茅市| 海门市| 海淀区| 云阳县| 抚松县| 南澳县| 博客| 邓州市| 临夏市| 和林格尔县| 聂拉木县| 滦南县| 武义县| 长沙县| 遂宁市| 皋兰县| 唐海县|