关于tomcat连接池的配置我在自己开始的时候碰到过许多的问题至少失败过六次今天终于成功了对于这个问题的产生与由来我也给大伙说说
在《程序员csdn开发高手》这本杂志的年第期一位名叫宋廷宇的老师写了一篇文章名赤《tomcat连接池的图形化配置与使用》我看到了这篇文章该作者所使用的数据库是sql server而我所使用的数据库是mysqltomcat版本为文中有这么一段话在tomcat 及后续版本中提供了图形界面的web应用发布工具但是使用这个工具发布采用数据库连接池的web应用时自动生成的配置不能找到数据源这是一个bug相信在后续的版本中所有关于数据库连接池的配置和发布都不需要在手工修改配置文件而使用简单方便的全图形化工具当时我个人认为我所使用的tomcat 版的bug应该修正了吧况且数据库配置嘛换汤不换药原理应该是一样的但是我严格按照这篇文章上来配置结果事与愿为配置成功运行后出错了附错误如下
orgapachecommonsdbcpSQLNestedException: 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( )再次试验首先是按照书上的文章进行图形化配置结果依然心里想bug肯定修正且我与作者的步骤一样问题休在???沉着冷静下来再次看看tomcat的文档又回想起宋廷宇老师的文章中那段话莫非真的是图形配置中的bug
http://jakartaapacheorg/tomcat/tomcatdoc/jndidatasourceexampleshowtohtml
好就来手工配置吧于是又打开tomcat的doc开始了手工配置配置之前建议大家对serverxml文件做一个备份原因就不讲了
打开serverxml文件在哪??晕!!打开tomcat$\conf文件夹(tomcat$指的是tomcat的安装目录下皆同)至于数据库的建立我就不说了自己按照文章去做吧说明一下尽管我不说我还是按照文章上来做的你们照葫芦画瓢即可
首先将那段
<Context path=/DBTest docBase=DBTest
debug= reloadable=true crossContext=true>
<!—注意到这里的DBTest了吧这就是要求大家建立DBTest目录的原因>
<Logger className=orgapachecatalinaloggerFileLogger
prefix=localhost_DBTest_log suffix=txt
timestamp=true/>
<Resource name=jdbc/TestDB
auth=Container
type=javaxsqlDataSource/>
<ResourceParams name=jdbc/TestDB>
<parameter>
<name>factory</name>
<value>orgapachecommonsdbcpBasicDataSourceFactory</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 for no limit
>
<parameter>
<name>maxActive</name>
<value></value>
</parameter>
<! Maximum number of idle dB connections to retain in pool
Set to for no limit
>
<parameter>
<name>maxIdle</name>
<value></value>
</parameter>
<! Maximum time to wait for a dB connection to become available
in ms in this example seconds An Exception is thrown if
this timeout is exceeded Set to to wait indefinitely
>
<parameter>
<name>maxWait</name>
<value></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 mmmysql 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>orggjtmmmysqlDriver</value>
</parameter>
这里面是被注释的因为以前连接mysql是这样连接的现在建议用下面的方法自己可以看到
>
<! Class name for the official MySQL Connector/J driver >
<parameter>
<name>driverClassName</name>
<value>commysqljdbcDriver</value>
</parameter>
<! The JDBC connection url for connecting to your MySQL dB
The autoReconnect=true argument to the url makes sure that the
mmmysql JDBC Driver will automatically reconnect if mysqld closed the
connection mysqld by default closes idle connections after hours
>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:/javatest?autoReconnect=true</value>
<!这是数据库的地址也可以不要这么繁琐改为
jdbc:mysql://localhost/javatest即可javatest为数据库名>
</parameter>
</ResourceParams>
</Context>
贴在这了别嫌长啊我加了注释至于我们贴到什么位置在</Host>前面找到相对应的位置由于我的serverxml文件未备份所以我无法再次将所贴位置告诉大家了不好意思有事给我发过来我一定还记得的到时再手把手教你们
在tomcat$\webapps文件夹下建立一个名为DBTest的文件夹注意大小写在此文件夹下建立WEBINF文件夹及一个文件:testjsp再在WEBINF文件夹下建立两个文件夹lib及classes将数据库驱动文件拷贝到lib文件夹下同样还在WEBINF文件夹下建一个文件webxml看到doc上有现成的要不要拷贝呀这就有个问题doc有个问题有空给它们写封信吧这也是我经过实现才发现的
<?xml version= encoding=ISO?>
<webapp xmlns=http://javasuncom/xml/ns/jee
xmlns:xsi=http://wwwworg//XMLSchemainstance
xsi:schemaLocation=http://javasuncom/xml/ns/jee
http://javasuncom/xml/ns/jee/webapp__xsd version=>
<description>MySQL Test App</description>
<resourceref>
<description>DB Connection</description>
<resrefname>jdbc/TestDB</resrefname>
<restype>javaxsqlDataSource</restype>
<resauth>Container</resauth>
</resourceref>
</webapp>
用我的没错的
Testjsp
<%@ page contentType=text/html; charset=GBK%>
<%@ page import=javasql*javaxsqlDataSourcejavaxnaming*%>
<html>
<head><title>testjsp</title></head>
<body bgcolor=#ffffff>
<h>test Tomcat</h>
<%
try
{
Context initCtx=new InitialContext();
DataSource ds = (DataSource)initCtxlookup(java:comp/env/jdbc/TestDB);
Connection conn=dsgetConnection();
outprintln(data from database:<br>);
Statement stmt=conncreateStatement();
ResultSet rs =stmtexecuteQuery(select id foo bar from testdata);
while(rsnext())
{
outprintln(rsgetInt(id));
outprintln(rsgetString(foo));
outprintln(rsgetString(bar));
}
rsclose();
stmtclose();
}
catch(Exception e)
{
eprintStackTrace();
}
%>
</body>
</html>
doc上的testjsp是使用了tag 我认为没必要大家反而看不懂并且它没有关闭connection及statement个人认为存在不安全因素因此我自己也改过来了
接下来的事情嘛自己测试测试前要将mysql打开常识性的错误别犯了
启动tomcat至http://localhost:/DBTest/testjsp在我的界面上是
test Tomcat
data from database:
hello