标题:Tomcat4/5连接池的设置及简单应用示例
    
    
    关键字:Tomcat 连接池 JDBC驱动 Context  
    
    
    作者:jrq
    
    
    内容:
    
    
    一、Win2k下Tomcat4的连接池的配置
    
    
    1.安装JDK1.4和jakarta-tomcat-4.1.27.exe。
    
    
      路径分别为 D:/jdk1.4 和 D:/Tomcat 4.1。
    
      安装Tomcat 4时,会要求填写web访问端口、用户名、密码等信息。
    
      web访问端口默认为8080,用户名默认为admin,密码自己填写。
    
    
      启动Tomcat4,访问
    
      http://127.0.0.1:8080/
    
     ,就能看到Apache Tomcat/4.1.27的欢迎访问页面,页面上有一些相关介绍信息等。
    
    
    
    2.设置数据库的驱动
    
    
      以Oracle的JDBC驱动设置为例:
    
    
      Oracle8i的驱动在/oracle/ora81/jdbc/lib/目录下。名字为classes12.zip。
    
    
      Oracle9i的驱动在/oracle9i/jdbc/lib/目录下,名字为ojdbc14.jar。
    
    
      将这个文件copy到D:/Tomcat 4.1/common/lib 下。
    
    
      注意,如果使用Oracle8i 的驱动,则需要在D:/Tomcat 4.1/common/lib 目录下将classes12.zip更名为classes12.jar,因为Tomcat4不认识zip的后缀名。
    
    
    
    3.设置Web应用。
    
    
      新建一个文件夹,名字为mypool,位置为D:/mypool。这个D:/mypool路径将是web应用的主目录。
    
    
      打开D:/Tomcat 4.1/conf/server.xml 文件,找到如下行:
    
      
    
       <!-- Tomcat Root Context -->
    
         <!--
    
             <Context path="" docBase="ROOT" debug="0"/>
    
         -->
    
     
    
     
    
      在这下面,加入如下行:
    
      
    
      <Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
    
    
      
    
      完成后,成为这个样子:
    
    
        <!-- Tomcat Root Context -->
    
         <!--
    
              <Context path="" docBase="ROOT" debug="0"/>
    
          -->
    
        
    
         <Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
    
    
      保存D:/Tomcat 4.1/conf/server.xml 文件。
    
    
      配置完成后,重新启动Tomcat,就可以这样访问这个web应用了: 
    
      http://127.0.0.1:8080/mypool/
    
     。
    
    
    
    4.设置Tomcat的连接池数据源。
    
    
      访问 
    
      http://127.0.0.1:8080/admin
    
     页面,用刚才安装 Tomcat4 时填写的用户名和密码登录。
    
    
      登录成功后,会出现Tomcat 的web应用管理界面(Tomcat Web Server Administration Tool)。
    
    
      然后在左边的目录树点击“Data Sources”项,右边可以看到JNDI配置的页面。
    
     
    
      在右上角的下拉框中选择“Create New Data Source”,接下来填写配置信息:
    
      
    
      JNDI Name: jdbc/myOrcl  
    
      Data Source URL: jdbc:oracle:thin:@192.168.6.40:1521:dbserver
    
      JDBC Driver Class: oracle.jdbc.driver.OracleDriver
    
      User Name: myname
    
      Password: mypassword
    
      Max. Active Connections:  可用默认值 
    
      Max. Idle Connections:    可用默认值
    
      Max. Wait for Connection: 可用默认值
    
      Validation Query: 可不填写。
    
    
      然后,按下“save”按钮保存。
    
      再按下“Commit Changes”按钮将配置更改提交完成。
    
    
      此时如果看看 Tomcat4 的窗口,会发现在最下面有一行文字提示:  
    
    
       Debugging -- changes saved to conf/server.xml
    
     
    
      此时 D:/Tomcat 4.1/conf/server.xml 文件的配置已经更改保存完毕。
    
    
    
      如果此时打开D:/Tomcat 4.1/conf/server.xml 文件,会发现server.xml 文件的内容改变了很多。
    
      一些注释文字都被去掉了。
    
    
      还会发现上面第三步配置Web应用的如下文字
    
        
    
       <!-- Tomcat Root Context -->
    
         <!--
    
              <Context path="" docBase="ROOT" debug="0"/>
    
          -->
    
        
    
         <Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
    
    
      则被自动修改成了这样的:
    
    
         <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:/mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">
    
            </Context>
    
    
        
    
       好了,至此位置,对Oracle的应用连接池已经配置完毕。
    
       
    
       仔细对照server.xml 文件,会发现刚才所配置的连接池信息被放置在<GlobalNamingResources>标签中,这意味着这个信息是可以被全局引用的,大致是如下的样子:
    
    
        <GlobalNamingResources>
    
        <Environment name="simpleValue" override="true" type="java.lang.Integer" value="30"/>
    
        <Resource name="jdbc/myOrcl" scope="Shareable" type="javax.sql.DataSource"/>
    
        <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" scope="Shareable" type="org.apache.catalina.UserDatabase"/>
    
        
    
        <ResourceParams name="jdbc/myOrcl">
    
          <parameter>
    
            <name>maxWait</name>
    
            <value>5000</value>
    
          </parameter>
    
          <parameter>
    
            <name>maxActive</name>
    
            <value>200</value>
    
          </parameter>
    
          <parameter>
    
            <name>password</name>
    
            <value>mypassword</value>
    
          </parameter>
    
          <parameter>
    
            <name>url</name>
    
            <value>jdbc:oracle:thin:@192.168.6.40:1521:dbserver</value>
    
          </parameter>
    
          <parameter>
    
            <name>driverClassName</name>
    
            <value>oracle.jdbc.driver.OracleDriver</value>
    
          </parameter>
    
          <parameter>
    
            <name>maxIdle</name>
    
            <value>20</value>
    
          </parameter>
    
          <parameter>
    
            <name>username</name>
    
            <value>myname</value>
    
          </parameter>
    
        </ResourceParams>
    
        <ResourceParams name="UserDatabase">
    
          <parameter>
    
            <name>factory</name>
    
            <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
    
          </parameter>
    
          <parameter>
    
            <name>pathname</name>
    
            <value>conf/tomcat-users.xml</value>
    
          </parameter>
    
        </ResourceParams>
    
      </GlobalNamingResources>  
    
    
    
    5.设置web应用对连接池的引用。
    
      
    
      打开D:/Tomcat 4.1/conf/server.xml 文件,找到刚才配置的web应用文字,由于刚才server.xml 文件被自动修改过,并去掉了很多注释内容,所以刚才配置的web应用
    
    
       <Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
    
    
      被自动修改成了这样的:
    
    
         <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:/mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">
    
            </Context>
    
    
      在<Context></Context>的描述中加上本web应用对全局连接池的引用说明,如下文字:
    
    
        <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>  
    
    
      设置完成后,web应用的描述大致如下面的样子:
    
    
        <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:/mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">   
    
       
    
          <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>      
    
       
    
     </Context>
    
    
    
      保存D:/Tomcat 4.1/conf/server.xml 文件。
    
    
      注意,设置这个连接池的引用说明是非常重要的一步。
    
      一些朋友在Tomcat4中配置连接池失败的原因大都归咎与此。还有网上一些文章说这是一个Tomcat4的一个Bug。
    
      我用了整整两天两夜的时间才明白其中的奥秘。[:(]
    
      当时离疯掉只查一点点。因为毕竟配置一个连接池是很简单的。[:(]
    
    
    
    6.一般情况下,到此,连接池的设置就完成了。
    
    
      然后需要重新启动Tomcat,这样就可以使用连接池来工作了。
    
    
      但是,看到很多文章上说,还需要设置一下web.xml才能应用。我没有设置web.xml,连接池也可以完全使用。
    
    
      现在说一下web.xml的配置方法。
    
    
      在D:/mypool中新建文件夹,命名为WEB-INF,注意是大写的字母。
    
    
      然后在D:/mypool/WEB-INF/ 下新建文件web.xml,其内容为:
    
    
      <web-app>
    
        <resource-ref>
    
            <description>Oracle DataSource example</description>
    
            <res-ref-name>jdbc/myOrcl</res-ref-name>
    
            <res-type>javax.sql.DataSource</res-type>
    
            <res-auth>Container</res-auth>
    
        </resource-ref>
    
      </web-app>
    
    
      保存D:/mypool/WEB-INF/web.xml 文件。
    
    
    
    7.一个简单的应用示例。
    
    
      写了一个简单的JSP页面,用连接池来访问数据库。
    
    
    内容如下:
    
    ---------------------
    
    <%@ page contentType="text/html;charset=GBK"%>
    
    <%@ page import="javax.naming.*"%>
    
    <%@ page import="javax.sql.*"%>
    
    <%@ page import="java.sql.*"%>
    
    <%
    
        try
    
        {                   
    
           Context initCtx = new InitialContext();
    
     
    
           if(initCtx==null)
    
              throw new Exception("没有匹配的环境");
    
    
           Context ctx = (Context) initCtx.lookup("java:comp/env");
    
          
    
           //获取连接池对象                   
    
           Object obj = (Object) ctx.lookup("jdbc/myOrcl");  
    
          
    
          //类型转换
    
           javax.sql.DataSource ds = (javax.sql.DataSource)obj;
    
             
    
           if(ds==null)
    
              throw new Exception("没有匹配数据库");  
    
        
    
           Connection conn = ds.getConnection();
    
          
    
           Statement stmt = conn.createStatement();                   
    
                                 
    
           String strSql="select * from grade";  //SQL,要保证grade数据表里面有记录。
    
                          
    
           ResultSet rs=stmt.executeQuery(strSql);
    
    
           if(rs.next())
    
             {                     
    
              out.println(rs.getString(1));                          
    
              out.println(rs.getString(2));                      
    
             }
    
           rs.close();      //关闭ResultSet  
    
           stmt.close();    //关闭Statement
    
           conn.close();    //将连接放回到连接池
    
         }
    
    
         catch(Exception ex)
    
    
         {    
    
             ex.printStackTrace();
    
             throw new SQLException("cannot get Connection pool."+ex);
    
         }
    
    %>
    
    
    <hr>
    
    --------------------
    
      
    
    记住,用完后的数据库连接要释放。
    
    不然当打开的连接过多或恶意刷屏,连接池的连接数目会被用完。
    
    当连接池的连接数目用完后,再访问jsp页面时,会在页面出现如下的错误信息,报告连接池的连接被耗尽:
    
    java.sql.SQLException: DBCP could not obtain an idle db connection, pool exhausted
    
    
    
    
    
    二、Win2k下Tomcat5 的连接池的配置
    
    
    安装jakarta-tomcat-5.0.13.exe,假如Tomcat5的安装目录为 D:/Tomcat 5.0 。
    
    
    别忘了把oracle的驱动程序classes12.jar文件copy到目录 D:/Tomcat 5.0/common/lib/ 下。
    
    
    Tomcat5的连接池设置和Tomcat4 的差不多,仅说明一下不同点或需要特别注意的地方。
    
    
    
    1. Tomcat5启动后,访问 
    
      http://127.0.0.1:8080/admin
    
     页面,当设置完Tomcat的连接池数据源后,打开D:/Tomcat 5.0/conf/server.xml 文件,会看到配置的连接池相关信息大致如下样子:
    
    
    <GlobalNamingResources>
    
        <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    
        <Resource name="jdbc/myOrcl" type="javax.sql.DataSource"/>
    
        <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>
    
        <ResourceParams name="jdbc/myOrcl">
    
          <parameter>
    
            <name>maxWait</name>
    
            <value>5000</value>
    
          </parameter>
    
          <parameter>
    
            <name>maxActive</name>
    
            <value>4</value>
    
          </parameter>
    
          <parameter>
    
            <name>password</name>
    
            <value>mypassword</value>
    
          </parameter>
    
          <parameter>
    
            <name>url</name>
    
            <value>jdbc:oracle:thin:@127.0.0.1:1521:dbserver</value>
    
          </parameter>
    
          <parameter>
    
            <name>driverClassName</name>
    
            <value>oracle.jdbc.driver.OracleDriver</value>
    
          </parameter>
    
          <parameter>
    
            <name>maxIdle</name>
    
            <value>2</value>
    
          </parameter>
    
          <parameter>
    
            <name>username</name>
    
            <value>myusername</value>
    
          </parameter>
    
        </ResourceParams>
    
        <ResourceParams name="UserDatabase">
    
          <parameter>
    
            <name>factory</name>
    
            <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
    
          </parameter>
    
          <parameter>
    
            <name>pathname</name>
    
            <value>conf/tomcat-users.xml</value>
    
          </parameter>
    
        </ResourceParams>
    
      </GlobalNamingResources>
    
    
    可以看到,一些连接池的信息配置参数已经和Tomcat4不同了。
    
    但大致配置步骤和方法都是一样的。
    
    
    
    2.设置web应用对连接池的引用。
    
    
     打开D:/Tomcat 5.0/conf/Catalina/localhost/ 目录,找到和web应用同名的xml文件(mypool.xml),打开这个文件,
    
    修该其<Context></Context>的描述信息,添加如下行:
    
    
       <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>  
    
    
    使mypool.xml文件的内容看起来大致这个:
    
      
    
       <Context docBase="D:/mypool" path="/mypool" privileged="true" reloadable="true">
    
         <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>
    
       </Context>
    
    
    然后保存mypool.xml,需要重新Tomcat5服务,使之生效。
    
    
    
    3.JSP页面测试文件的写法也是一样的,不再赘述。
    
    
    4.一些补充:
    
    
      如果web应用没有配置对连接池的引用,即没有配置<ResourceLink>,则会在访问jsp页面时出现如下错误:
    
        NameNotFoundException: Name jdbc is not bound in this Context
    
    
      如果缺少Oracle的JDBC驱动,则会在访问jsp页面时出现如下错误:
    
        java.sql.SQLException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
    
    
    
    
    
                                                                                                                                            by  jrq
    
                         
    
                                                                                                                          2004年10月26日夜  于石市 
  


 
					 
					