tomcat6数据库连接池配置详解

tomcat6数据库连接池配置详解

首先说明下我的配置环境
tomcat的版本是apache-tomcat-6.0.33非安装版本,路径为D:\Java\apache-tomcat-6.0.33,tomcat环境变量不设置不影响连接池的配置,
mysql的驱动是mysql-connector-java-5.1.7-bin.jar,我建立的项目为JavaWeb。

在TOMCAT6中配置数据库连接池,我自己测试成功的方法有四种:
1)、配置全局数据库连接池(通过server.xml文件配置)
2)、配置全局数据库连接池(通过context.xml文件配置)
3)、配置局部数据库连接池(建立同项目名称相同的配置文件,放在%TOMCATHOME%\conf\Catalina\localhost,
我电脑目录为D:\Java\apache-tomcat-6.0.33\conf\Catalina\localhost)
4)、配置局部数据库连接池(建立context.xml文件,放置在项目的META-INF目录下)


第一种方法:
在server.xml配置文件中host标签下添加如下代码:
<Context path="/JavaWeb" docBase="JavaWeb" debug="0">
<Resource name="jdbc/webdb" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/webdb"
username="root"
password="root"
maxActive="200"
maxIdle="50"
maxWait="3000"/>
</Context>

第二种方法:
在context.xml配置文件中添加如下代码:
<Context path="/JavaWeb" docBase="JavaWeb" debug="0">
<Resource name="jdbc/webdb" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/webdb"
username="root"
password="root"
maxActive="200"
maxIdle="50"
maxWait="3000"/>
</Context>

第三种方法:
建立一个同项目名称相同的xml文件,如JavaWeb.xml,内容如下:
<?xml version='1.0' encoding='utf-8'?>
<Context path="/JavaWeb" docBase="JavaWeb" debug="0">
<Resource name="jdbc/webdb" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/webdb"
username="root"
password="root"
maxActive="200"
maxIdle="50"
maxWait="3000"/>
</Context>
将此文件放置在%TOMCATHOME%\conf\Catalina\localhost目录下。

第四种方法:
建立context.xml文件,内容如下:
<?xml version='1.0' encoding='utf-8'?>
<Context path="/JavaWeb" docBase="JavaWeb" debug="0">
<Resource name="jdbc/webdb" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/webdb"
username="root"
password="root"
maxActive="200"
maxIdle="50"
maxWait="3000"/>
</Context>
将其放置在JavaWeb项目中的META-INF目录下。
说明:tomcat加载文件context.xml后,会在%TOMCATHOME%\conf\Catalina\localhost目录下生成同项目名称相同的xml文件,如JavaWeb.xml。


以前配置过全局数据库连接池,就是修改server.xml文件,个人觉得这种配置方法非常不好,决定尝试下其他的连接池配置方法,也就有了今天这份文章。说下我配置中
出现的问题,需要的朋友可以借鉴下。刚开始我配置的时候,建立了一个同项目名称相同的配置文件:
JavaWeb.xml配置如下:
<?xml version='1.0' encoding='utf-8'?>
<Context path="/JavaWeb" docBase="JavaWeb" debug="0">
<ResourceLink name="jdbc/webdb" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/webdb?characterEncoding=UTF-8"
username="root"
password="root"
maxActive="200"
maxIdle="50"
maxWait="3000"/>
</Context>
按照书上的说明,这样配置就可以了。而实际上配置文件应该是起作用了,不起作用的话会报javax.naming.NameNotFoundException: Name book is not bound in this Context 这个错误的,可是就是不能获取数据连接。
而报错如下:
java.lang.NullPointerException
at common.DBServlet.service(DBServlet.java:42)
at logreg.Register.service(Register.java:20)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
null


开始以为是url的字符集引起的,取消掉后测试不是这个原因。仔细对比了下网上的配置文件,发现标签Resource复制成了ResourceLink,修改后就连接成功了。
按照网上的说法,说配置web.xml可有可无,我自己测试也没有配置,结果测试能够通过。
需要的配置的话,可以参考如下代码:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/webdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

不过在测试的时候出现了一些问题,控制台虽然没有报错,但是出现一些红色的警报:
2011-9-8 10:27:04 org.apache.catalina.startup.HostConfig checkResources
信息: Reloading context [/JavaWeb]
2011-9-8 10:27:04 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/JavaWeb] appears to have started a thread named [AWT-Windows] but has failed to stop it. This is very likely to create a memory leak.
2011-9-8 10:27:04 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/JavaWeb] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
如果知道的朋友是什么原因造成的,希望能告诉我。

顺便说明下,mysql的驱动jar包,可以放到项目中的lib中,也可以放置到tomcat的lib中,可能由于版本的问题,测试结果不相同(修改server.xml的方法没有测试)。

下面的语句是读取配置文件的java语句:
javax.naming.Context ctx = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("java:/comp/env/jdbc/webdb");
conn = ds.getConnection();

如果你也出现了下面的问题,很可能是你的配置文件出错,仔细检查下,可能就会发现问题。
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at common.DBServlet.service(DBServlet.java:43)
at logreg.Register.service(Register.java:20)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
at java.sql.DriverManager.getDriver(Unknown Source)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 17 more
null

如果建立了context.xml文件,放到%TOMCATHOME%\conf\Catalina\localhost目录下时就会报下面的错误。
java.lang.IllegalArgumentException: Document base D:\Java\apache-tomcat-6.0.33\webapps\context does not exist or is not a readable directory
at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:142)
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4320)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4489)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2011-9-8 14:55:54 org.apache.catalina.core.StandardContext start

以上是我在tomcat6中配置数据库连接池的经验,希望对于需要的人有所帮助。由于本人的经验、能力有限,如有理解错误的地方,希望大家发email及时通知我,
我的邮箱是srb.123@163.com。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值