【发布时间】:2011-07-15 02:01:30
【问题描述】:
我正在使用 commons-dbcp 为小型 Spring webapp 中的 MySQL 数据库进行连接池,该 webapp 使用 Sun 1.6 JDK 作为 WAR 文件部署到本地 Tomcat 6.0.28 容器(使用 Ubuntu 包管理器安装) .部署是使用 tomcat-maven-plugin-1.1 从 Maven 完成的,目标是 tomcat:redeploy。 MySQL Connector/J jar 位于 webapp 的 WEB-INF/lib 目录中。
Tomcat 启动后第一次加载 webapp,一切正常。但是,当我重新部署 webapp 时,当 Tomcat 取消部署 webapp 时,它会抱怨 JDBC 驱动程序没有取消注册。
code>严重:Web 应用程序 [/taskrun] 注册了 JBDC 驱动程序 [com.mysql.jdbc.Driver] 但在 Web 应用程序停止时未能取消注册。为防止内存泄漏,已强制注销 JDBC 驱动程序。 2011 年 3 月 11 日上午 11:29:46 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
然后,Tomcat重启webapp时,连接数据库失败,抱怨没有合适的驱动:
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.jdbc2.optional.MysqlDataSource' for connect URL 'jdbc:mysql://127.0.0.1:3306/testdb?autoReconnect=true'
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
... 14 more
Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:279)
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 18 more
如果我在重新部署后手动重启 Tomcat,一切正常。
我知道 MySQL 驱动程序在加载类时会向 DriverManager 注册自身,但在重新部署 webapp 时似乎没有重新加载 com.mysql.jdbc.Driver 类。 Tomcat的WebappClassLoader是否应该在重新加载webapp时从WEB-INF/lib目录重新加载类,还是在部署之间将它们保存在内存中?还是我必须在部署后自己重新注册 MySQL 驱动程序?
另外,我看到很多帖子建议将驱动程序 jar 移动到 Tomcat 的 commons/lib 目录,但我想尽可能避免依赖于我的 WAR 文件外部。
提前感谢您的帮助。
【问题讨论】:
标签: mysql jdbc tomcat6 apache-commons-dbcp