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