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

时间:2011-03-14 14:46:19

标签: mysql jdbc tomcat6 apache-commons-dbcp

我使用commons-dbcp在一个小的Spring webapp中为MySQL数据库建立连接池,它使用Sun 1.6 JDK作为WAR文件部署到本地Tomcat 6.0.28容器(使用Ubuntu软件包管理器安装) 。使用tomcat-maven-plugin-1.1以及目标tomcat:redeploy从Maven完成部署。 MySQL Connector / J jar位于webapp的WEB-INF/lib目录中。

Tomcat启动后第一次加载webapp,一切正常。但是,当我重新部署webapp时,由于Tomcat取消部署webapp,它会抱怨JDBC驱动程序没有注册。

code>SEVERE: The web application [/taskrun] registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Mar 11, 2011 11:29:46 AM 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文件外部的依赖项。

提前感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

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