重新部署后,Tomcat webapp无法使用MySQL驱动程序

我使用commons-dbcp在一个小的Spring webapp中为MySQL数据库建立连接池,它使用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> SEVERE: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文件外部的依赖项。 提前感谢您的任何帮助。     
已邀请:
将JDBC驱动程序放到WEB-INF / lib通常是个坏主意。通常,JDBC驱动程序在所有已部署的应用程序之间共享,并且在正确的配置中,它们应该是全局Tomcat配置的一部分(将其添加到Tomcat的“lib”)。除非您有非常具体的理由,否则每次更新应用程序时都不应重新部署驱动程序。     

要回复问题请先登录注册