我正在使用 commons-dbcp 为小型 Spring webapp 中的 MySQL 数据库进行连接池,该应用程序使用 Sun 1.6 JDK 作为 WAR 文件部署到本地 Tomcat 6.0.28 容器(使用 Ubuntu 包管理器安装)。部署是从 Maven 使用 tomcat-maven-plugin-1.1 完成的,目标是tomcat:redeploy
. MySQL Connector/J jar 位于 webapp 的WEB-INF/lib
目录中。
Tomcat 启动后第一次加载 webapp,一切正常。但是,当我重新部署 webapp 时,当 Tomcat 取消部署 webapp 时,它会抱怨 JDBC 驱动程序没有取消注册。
代码>严重: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 注册自身,但是在com.mysql.jdbc.Driver
重新部署 webapp 时似乎没有重新加载该类。Tomcat的WebappClassLoader是否应该在重新加载WEB-INF/lib
webapp时从目录中重新加载类,还是在部署之间将它们保存在内存中?还是我必须在部署后自己重新注册 MySQL 驱动程序?
此外,我看到很多帖子建议将驱动程序 jar 移动到 Tomcat 的commons/lib
目录,但我想尽可能避免依赖于我的 WAR 文件外部。
提前感谢您的任何帮助。