tomcat连接池的配置

 转载

关于 tomcat 连接池的配置,我在自己开始的时候碰到过许多的问题,至少失败过六次,今天终于成功了。对于这个问题的产生与由来我也给大伙说说。
在《程序员 csdn 开发高手》这本杂志的 2004 年第 02 期,一位名叫宋廷宇的老师写了一篇文章,名赤《 tomcat 连接池的图形化配置与使用》,我看到了这篇文章,该作者所使用的数据库是 sql server ,而我所使用的数据库是 mysql tomcat 版本为 5.0   19 。文中有这么一段话: tomcat 4.1.18 及后续版本中提供了图形界面的 web 应用发布工具,但是使用这个工具发布采用数据库连接池的 web 应用时,自动生成的配置不能找到数据源。这是一个 bug ,相信在后续的版本中所有关于数据库连接池的配置和发布都不需要在手工修改配置文件,而使用简单方便的全图形化工具 。当时我个人认为:我所使用的 tomcat 5.0 版的, bug 应该修正了吧,况且数据库配置嘛,换汤不换药,原理应该是一样的,但是我严格按照这篇文章上来配置,结果事与愿为,配置成功运行后出错了。附错误如下:
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '
' for connect URL 'null', cause: No suitable driver
相信学过 jsp 连接数据库的人都有常识,那就是将驱动加入 CLASSPATH 。排除错误,驱动没问题。迷惑中
于是乎,检查,重来再检查,再重来,错误不变。
既然图形下配置错误,那么我手动配置。上网搜索,最权威的当然就是 tomcat doc 。刚好文档中有一篇讲如何配置 mysql 数据库连接池的(全英文的,幸好我英语过得去),一步一步严格按照它的格式来配置,当我看到同样的错误时,犹如晴天劈雳。一个字:晕!!!差点放弃。(如果放弃了,就不会有我今天这篇文章了,好险呀!!!)
因此我认为 tomcat 有问题。这个错误很多人都见过,在 csdn 及本论坛上,有许多人问到这样的问题,为这问题,我还在国外的论坛上搜索了,也有人问到这样的问题,他们说这是 tomcat 的一个 bug, 于是我就默认了。后来想想不对,如果是 bug 的话, jarkata 项目组织肯定会贴出来并且修正这个 bug 的。
我就下载了最新版本的 tomcat(5.0 25) 再次试验,首先是按照书上的文章进行图形化配置,结果依然,心里想, bug 肯定修正,且我与作者的步骤一样。问题休在???沉着冷静下来,再次看看 tomcat 的文档。又回想起宋廷宇老师的文章中那段话,莫非真的是图形配置中的 bug
http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jndi-datasource-examples-howto.html
好,就来手工配置吧。于是又打开 tomcat doc 开始了手工配置。配置之前建议大家对 server.xml 文件做一个备份,原因就不讲了。
打开 server.xml 文件,在哪??晕!!打开 tomcat$/conf 文件夹( tomcat$ 指的是 tomcat 的安装目录,下皆同)。至于数据库的建立我就不说了,自己按照文章去做吧,说明一下,尽管我不说,我还是按照文章上来做的,你们照葫芦画瓢即可。
首先将那段
<Context path="/DBTest" docBase="DBTest"
       debug="5" reloadable="true" crossContext="true">
<!—
注意到这里的 DBTest 了吧,这就是要求大家建立 DBTest 目录的原因。 -->
 <Logger className="org.apache.catalina.logger.FileLogger"
            prefix="localhost_DBTest_log." suffix=".txt"
            timestamp="true"/>
 <Resource name="jdbc/TestDB"
              auth="Container"
              type="javax.sql.DataSource"/>
 <ResourceParams name="jdbc/TestDB">
   <parameter>
     <name>factory</name>
     <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
   </parameter>
   <!-- Maximum number of dB connections in pool. Make sure you
        configure your mysqld max_connections large enough to handle
        all of your db connections. Set to 0 for no limit.
        -->
   <parameter>
     <name>maxActive</name>
     <value>100</value>
   </parameter>
   <!-- Maximum number of idle dB connections to retain in pool.
        Set to 0 for no limit.
        -->
   <parameter>
     <name>maxIdle</name>
     <value>30</value>
   </parameter>
   <!-- Maximum time to wait for a dB connection to become available
        in ms, in this example 10 seconds. An Exception is thrown if
        this timeout is exceeded.  Set to -1 to wait indefinitely.
        -->
   <parameter>
     <name>maxWait</name>
     <value>10000</value>
   </parameter>
   <!-- MySQL dB username and password for dB connections  -->
   <parameter>
    <name>username</name>
    <value>javauser</value>
<!—
数据库用户名 -->
   </parameter>
   <parameter>
    <name>password</name>
    <value>javadude</value>
<!—
数据库密码 -->
   </parameter>
   <!-- Class name for the old mm.mysql JDBC driver - uncomment this entry and comment next
        if you want to use this driver - we recommend using Connector/J though
   <parameter>
      <name>driverClassName</name>
      <value>org.gjt.mm.mysql.Driver</value>
</parameter>
这里面是被注释的,因为以前连接 mysql 是这样连接的,现在建议用下面的方法,自己可以看到。
    -->
   
   <!-- Class name for the official MySQL Connector/J driver -->
   <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
   </parameter>
   
   <!-- The JDBC connection url for connecting to your MySQL dB.
        The autoReconnect=true argument to the url makes sure that the
        mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
        connection.  mysqld by default closes idle connections after 8 hours.
        -->
   <parameter>
     <name>url</name>
     <value>jdbc:mysql://localhost:3306/javatest?autoReconnect=true</value>
<!--
这是数据库的地址,也可以不要这么繁琐,改为
jdbc:mysql://localhost/javatest
即可 ,javatest 为数据库名 -->
   </parameter>
 </ResourceParams>
</Context>
贴在这了,别嫌长啊。我加了注释。至于我们贴到什么位置,在 </Host> 前面,找到相对应的位置,由于我的 server.xml 文件未备份,所以我无法再次将所贴位置告诉大家了,不好意思,有事给我发过来,我一定还记得的,到时再手把手教你们。
tomcat$/webapps 文件夹下建立一个名为 DBTest 的文件夹,注意大小写。在此文件夹下建立 WEB-INF 文件夹,及一个文件 :test.jsp ,再在 WEB-INF 文件夹下建立两个文件夹: lib classes ,将数据库驱动文件拷贝到 lib 文件夹下,同样还在 WEB-INF 文件夹下建一个文件 web.xml ,看到 doc 上有现成的,要不要拷贝呀,这就有个问题, doc 有个问题,有空给它们写封信吧,这也是我经过实现才发现的。
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"  version="2.4">
 <description>MySQL Test App</description>
 <resource-ref>
     <description>DB Connection</description>
     <res-ref-name>jdbc/TestDB</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
 </resource-ref>
</web-app>
用我的,没错的。
Test.jsp
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,javax.sql.DataSource,javax.naming.*"%>
<html>
<head><title>test.jsp</title></head>
<body bgcolor="#ffffff">
<h1>test Tomcat</h1>
<%
try
{
Context initCtx=new InitialContext();
DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/TestDB");
Connection conn=ds.getConnection();
out.println("data from database:<br>");
Statement stmt=conn.createStatement();
ResultSet rs =stmt.executeQuery("select id, foo, bar from testdata");
while(rs.next())
{
out.println(rs.getInt("id"));
out.println(rs.getString("foo"));
out.println(rs.getString("bar"));
}
rs.close();
stmt.close();
}
catch(Exception e)
{
e.printStackTrace();
}
%>
</body>
</html>
doc
上的 test.jsp 是使用了 tag ,我认为没必要,大家反而看不懂,并且它没有关闭 connection statement ,个人认为存在不安全因素,因此我自己也改过来了。
接下来的事情嘛,自己测试,测试前要将 mysql 打开,常识性的错误别犯了。
启动 tomcat
http://localhost:8080/DBTest/test.jsp
在我的界面上是
test Tomcat
data from database:
1 hello 12345
大家尽情享用吧。

有问题,请联系 liyong_2003@hotmail.com
如有转载,请注明出处。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值