Tomcat5.5+Oracle 配置数据库连接池

一.          环境

Tomcat 5.5 + Oracle + eclipse 3.2.2 + MyEclipse 5.5.1 GA。

二.          驱动

将Oracle的驱动classes12.jar和classes111.zip(将后缀zip改为jar,据说不识别*.zip)拷到Tomcat 5.5/common/lib下。

三.          配置Tomcat5.5/conf/server.xml

在<Host>标签里面的最后加上:

<Context path="/Test" docBase="Test" debug="5" reloadable="true" crossContext="true">

                            <Resource

                         name="jdbc/Test"

                         type="javax.sql.DataSource"

                         auth="Container"

                         username="myusername"

                         password="mypassword"

                         url="jdbc:oracle:thin:@localhost:1521:DBTest"

                         driverClassName="oracle.jdbc.driver.OracleDriver"

                         maxIdle="2"

                         maxWait="5000"

                         maxActive="4"/>                     

       </Context>

      

       据说在5.5版本里不能写成如下形式:

<Resource name="jdbc/epoliceQuery" auth="Container"

type="javax.sql.DataSource"/>

<ResourceParams name="jdbc/epoliceQuery">

       <parameter>

<name>factory</name>                               

<value>

org.apache.commons.dbcp.BasicDataSourceFactory

</value>

    </parameter>

    <parameter>

       <name>driverClassName</name>

       <value>

oracle.jdbc.driver.OracleDriver

</value>

    </parameter>

    <parameter>

       <name>url</name>

       <value>

jdbc:oracle:thin:@ localhost:1521:DBTest

</value>

   </parameter>

   <parameter>

        <name>username</name>

        <value>myusername</value>

   </parameter>

   <parameter>

           <name>password</name>

           <value>mypassword</value>

   </parameter>

   <parameter>

       <name>maxActive</name>

       <value>20</value>

   </parameter>

   <parameter>

       <name>maxIdle</name>

       <value>10</value>

   </parameter>

   <parameter>

       <name>maxWait</name>

       <value>10000</value>

   </parameter>

</ResourceParams>

</Resource>

       而且不能把这部分内容加到<Service>标签内,应加在<Host>标签内,不然就会抛异常报错“Cannot create JDBC driver of class '' for connect URL 'null'”。

    但很多网文,包括一些书上都要求加在<Service>标签内,但是我用的时候就是会出错。最后在网上搜索解决办法,改加在<Host>标签内就没有问题了。

四.          配置Tomcat5.5/conf/web.xml

在<web-app>标签内加入以下内容:

<resource-ref>

     <description>DB Connection</description>

     <res-ref-name>jdbc/Test</res-ref-name>

     <res-type>javax.sql.DataSource</res-type>

     <res-auth>Container</res-auth>

</resource-ref>

要求<res-ref-name>jdbc/Test</res-ref-name>中的“jdbc/Test”一定要与在server.xml中配置的Resource中的name一致,不然会出错。

五.          测试程序

可以写一个jsp测试连接池。

test.jsp内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

<%@ page import="javax.naming.*" %>

<%@ page import="javax.sql.*" %>

<%@ page import="java.sql.*" %>

<%@ page import="java.util.*" %>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>My JSP 'test.jsp' starting page</title>

   

       <meta http-equiv="pragma" content="no-cache">

       <meta http-equiv="cache-control" content="no-cache">

       <meta http-equiv="expires" content="0">   

       <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

       <meta http-equiv="description" content="This is my page">

       <!--

       <link rel="stylesheet" type="text/css" href="styles.css">

       -->

 

  </head>

 

  <body>

    <%

      DataSource ds = null;

      try{

            Context initCtx = new InitialContext();

            if(initCtx == null) {

                throw new Exception("No Context");

            }

            Context envCtx = (Context)initCtx.lookup("java:comp/env/");          

 

            //获取连接池对象并进行类型转换

                     ds = (DataSource)envCtx.lookup("jdbc/Test");

                     //ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/Test");           

 

            if(ds!=null){

                  Connection cn=ds.getConnection();                

                  out.println("Connection is OK!");

                  if(cn!=null){

                        out.println("cn is Ok!");

                        java.sql.Statement stmt = cn.createStatement();

                        ResultSet rst = stmt.executeQuery("select testName from testTable");

                        out.println("<p>rst is Ok!");

                        while(rst.next()){

                              out.println("<P>Ename:" + rst.getString("testName"));

                        }                                        

                        rst.close();                                        

                         stmt.close();                        

                         cn.close();

                  }else{

                        out.println("rst Fail!");

                  }

            }else{

                  out.println("Fail!");

            }

      }catch(Exception ne){

            out.println(ne);

      }

%>

  </body>

</html>

      

部署启动后,在浏览器中输入http://localhsot:8080/Test/test.jsp测试连接池是否正确工作。

六.          Tomcat启动加载类

我配置好数据库连接池后,用这种方法比以前查询数据库速度大有提高,但是很奇怪的是我重起Tomcat后,第一次查数据库总是很慢,但是之后就好多了。第 一次大概要20s,但之后就不到1s。查找原因不是缓存的问题,后来调试发现第一次getConnection的时候,耗去了20s的绝大部分时间。很奇 怪为什么会这样,有待继续研究。于是我就写了个Servlet,在Tomcat启动的时候执行,内容是进行一次getConnection,这样之后速度 就快了。创建Servlet之后,在工程的WEB-INF/web.xml里加上:

<servlet>

<description>

This is the description of my J2EE omponent

</description>

<display-name>

This is the display name of my J2EE component

</display-name>

    <servlet-name>StartUpOnLoading</servlet-name>

<servlet-class>

com.test.servlet.StartUpOnLoading

</servlet-class>

    <load-on-startup>1</load-on-startup>

</servlet>

    主要是这句:“<load-on-startup>1</load-on-startup>”。这样在Tomcat启动的时候,就是自动运行这个Servlet了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值