Tomcat веб-приложение не может использовать драйвер MySQL после повторного развертывания - PullRequest
4 голосов
/ 14 марта 2011

Я использую 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-файлу.

Заранее благодарю за любую помощь.

1 Ответ

2 голосов
/ 17 марта 2011

Размещение драйвера JDBC в WEB-INF / lib обычно плохая идея.Обычно драйверы JDBC совместно используются всеми развернутыми приложениями, и в правильной конфигурации они должны быть частью глобальной конфигурации Tomcat (поместите ее в Tomcat 'lib').Драйвер не следует повторно развертывать каждый раз, когда вы обновляете свое приложение, если у вас нет для этого особых причин.

...