scuess 发表于 2018-12-7 14:39:50

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.xml配置文件中添加如下代码:
  
  
  
  第三种方法:
  建立一个同项目名称相同的xml文件,如JavaWeb.xml,内容如下:
  
  
  
  
  将此文件放置在%TOMCATHOME%\conf\Catalina\localhost目录下。
  第四种方法:
  建立context.xml文件,内容如下:
  
  
  
  
  将其放置在JavaWeb项目中的META-INF目录下。
  说明:tomcat加载文件context.xml后,会在%TOMCATHOME%\conf\Catalina\localhost目录下生成同项目名称相同的xml文件,如JavaWeb.xml。
  以前配置过全局数据库连接池,就是修改server.xml文件,个人觉得这种配置方法非常不好,决定尝试下其他的连接池配置方法,也就有了今天这份文章。说下我配置中
  出现的问题,需要的朋友可以借鉴下。刚开始我配置的时候,建立了一个同项目名称相同的配置文件:
  JavaWeb.xml配置如下:
  
  
  
  
  按照书上的说明,这样配置就可以了。而实际上配置文件应该是起作用了,不起作用的话会报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可有可无,我自己测试也没有配置,结果测试能够通过。
  需要的配置的话,可以参考如下代码:
  
  DB Connection
  jdbc/webdb
  javax.sql.DataSource
  Container
  
  不过在测试的时候出现了一些问题,控制台虽然没有报错,但是出现一些红色的警报:
  2011-9-8 10:27:04 org.apache.catalina.startup.HostConfig checkResources

  信息:>  2011-9-8 10:27:04 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
  严重: The web application appears to have started a thread named 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 appears to have started a thread named 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>  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

页: [1]
查看完整版本: tomcat6数据库连接池配置详解