4

我正在使用 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/libwebapp时从目录中重新加载类,还是在部署之间将它们保存在内存中?还是我必须在部署后自己重新注册 MySQL 驱动程序?

此外,我看到很多帖子建议将驱动程序 jar 移动到 Tomcat 的commons/lib目录,但我想尽可能避免依赖于我的 WAR 文件外部。

提前感谢您的任何帮助。

4

1 回答 1

2

将 JDBC 驱动程序放置到 WEB-INF/lib 通常是个坏主意。通常 JDBC 驱动程序在所有部署的应用程序之间共享,并且在适当的配置中,它们应该是全局 Tomcat 配置的一部分(将其放入 Tomcat 'lib')。除非您有非常具体的原因,否则不应在每次更新应用程序时重新部署驱动程序。

于 2011-03-17T18:52:28.260 回答