我使用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文件外部的依赖项。
提前感谢你的帮助。
答案 0 :(得分:2)
将JDBC驱动程序放到WEB-INF / lib通常是个坏主意。通常,JDBC驱动程序在所有已部署的应用程序之间共享,并且在正确的配置中,它们应该是全局Tomcat配置的一部分(将其添加到Tomcat的“lib”)。除非您有非常具体的理由,否则每次更新应用程序时都不应重新部署驱动程序。