Я использую commons-dbcp для создания пула соединений для базы данных MySQL в небольшом веб-приложении Spring, которое развертывается в виде файла WAR в локальный контейнер Tomcat 6.0.28 (устанавливается с помощью диспетчера пакетов Ubuntu) с использованием Sun 1.6 JDK , Развертывание выполняется из Maven с использованием tomcat-maven-plugin-1.1 с целью tomcat:redeploy
. MySQL Connector / Jar находится в каталоге WEB-INF/lib
веб-приложения.
При первой загрузке веб-приложения после запуска Tomcat все работает нормально. Однако при повторном развертывании веб-приложения Tomcat удаляет веб-приложение и жалуется, что драйвер 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 перезапускает веб-приложение, он не может подключиться к базе данных, жалуясь на отсутствие подходящего драйвера:
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
, похоже, не перезагружается при повторном развертывании веб-приложения. Должен ли Tomcat WebappClassLoader перезагружать классы из каталога WEB-INF/lib
при перезагрузке веб-приложения или он хранит их в памяти между развертываниями? Или я должен заново зарегистрировать драйвер MySQL после развертывания?
Кроме того, я видел множество постов, предлагающих переместить jar драйвера в каталог commons/lib
Tomcat, но я бы хотел как можно больше избегать зависимостей, внешних по отношению к моему WAR-файлу.
Заранее благодарю за любую помощь.