Я получаю это сообщение при запуске своего веб-приложения. Он работает нормально, но я получаю это сообщение во время выключения.
SEVERE: веб-приложение зарегистрировало драйвер JBDC [oracle.jdbc.driver.OracleDriver], но не удалось отменить его регистрацию при остановке веб-приложения. Чтобы предотвратить утечку памяти, драйвер JDBC был принудительно незарегистрирован.
Любая помощь приветствуется.
Ответы:
Начиная с версии 6.0.24, Tomcat поставляется с функцией обнаружения утечки памяти , которая, в свою очередь, может приводить к появлению таких предупреждений, когда в веб-приложении есть драйвер, совместимый с JDBC 4.0,
/WEB-INF/lib
который автоматически регистрируется во время запуска веб-приложения с помощьюServiceLoader
API , но который не авторегистрация себя во время закрытия веб-приложения. Это сообщение является чисто неформальным, Tomcat уже предпринял соответствующие меры по предотвращению утечки памяти.Что ты можешь сделать?
Игнорируйте эти предупреждения. Tomcat делает свою работу правильно. Фактическая ошибка в чужом коде (рассматриваемый драйвер JDBC), а не в вашем. Будьте счастливы, что Tomcat выполнил свою работу должным образом, и подождите, пока поставщик драйверов JDBC не исправит это, чтобы вы могли обновить драйвер. С другой стороны, вы не должны удалять драйвер JDBC в веб-приложениях
/WEB-INF/lib
, а только в серверах/lib
. Если вы по-прежнему храните его в веб-приложении/WEB-INF/lib
, вам следует вручную зарегистрировать и отменить регистрацию с помощьюServletContextListener
.Вернитесь к Tomcat 6.0.23 или более поздней версии, чтобы вас не беспокоили эти предупреждения. Но это будет молча продолжать утекать память. Не уверен, хорошо ли это знать в конце концов. Такие утечки памяти являются одной из основных причин
OutOfMemoryError
проблем, возникающих во время горячих развертываний Tomcat.Переместите драйвер JDBC в
/lib
папку Tomcat и получите источник данных пула соединений для управления драйвером. Обратите внимание, что встроенный DBCP Tomcat не отменяет регистрацию драйверов при закрытии. Смотрите также ошибку DBCP-322, которая закрывается как WONTFIX. Вы бы предпочли заменить DBCP другим пулом соединений, который выполняет свою работу лучше, чем DBCP. Например, HikariCP , BoneCP или, возможно, Tomcat JDBC Pool .источник
lib
).В методе contextDestroyed () прослушивателя контекста сервлета вручную отмените регистрацию драйверов:
источник
Хотя Tomcat принудительно отменяет регистрацию драйвера JDBC для вас, тем не менее, рекомендуется очистить все ресурсы, созданные вашим веб-приложением, при уничтожении контекста в случае, если вы переместитесь в другой контейнер сервлета, который не выполняет проверки предотвращения утечки памяти, как это делает Tomcat.
Однако методика отмены регистрации общего драйвера опасна. Некоторые драйверы, возвращаемые
DriverManager.getDrivers()
методом, возможно, были загружены родительским ClassLoader (т. Е. Загрузчиком классов контейнера сервлета), а не ClassLoader контекста веб-приложения (например, они могут находиться в папке lib контейнера, а не в веб-приложении, и, следовательно, совместно использоваться по всему контейнеру). ). Отмена регистрации повлияет на любые другие веб-приложения, которые могут их использовать (или даже на сам контейнер).Следовательно, следует проверить, что ClassLoader для каждого драйвера является ClassLoader веб-приложения, прежде чем отменять его регистрацию. Итак, в вашем методе contextDistener () вашего ContextListener:
источник
if (cl.equals(driver.getClass().getClassLoader())) {
?DriverManager
. Я оставил более подробный комментарий по адресу github.com/spring-projects/spring-boot/issues/…Я вижу, что эта проблема часто возникает. Да, Tomcat 7 автоматически отменяет регистрацию, но действительно ли он берет под свой контроль ваш код и хорошую практику кодирования? Конечно, вы хотите знать, что у вас есть весь правильный код, чтобы закрыть все ваши объекты, закрыть потоки пулов соединений с базой данных и избавиться от всех предупреждений. Я конечно делаю.
Вот как я это делаю.
Шаг 1: Зарегистрируйте слушателя
web.xml
Шаг 2: внедрить слушателя
com.mysite.MySpecialListener.java
Пожалуйста, не стесняйтесь комментировать и / или добавлять ...
источник
DataSource
нетclose
методаcontextDestroyed
? Почему вы делаете шаг 1. прежде чем делать шаг 2., гдеinitContext
,envContext
иdatasource
не ссылаются на все? Я спрашиваю, потому что я не понимаю, шаг 3.lookup
кажется, просто получает некоторые объекты, которые вам не нужны. Шаг 3. совершенно бесполезен. Это, конечно, не добавляет никакой безопасности и похоже на то, что сделали бы новички, не понимающие, как работает GC. Я бы просто пошел с stackoverflow.com/a/5315467/897024 и удалил все драйверы.Это чисто проблема регистрации / отмены регистрации драйвера в драйвере mysql или в tomcats webapp-classloader. Скопируйте драйвер mysql в папку lib tomcats (чтобы он загружался непосредственно jvm, а не tomcat), и сообщение исчезнет. Это делает драйвер mysql jdbc выгруженным только при выключении JVM, и никто не заботится об утечках памяти.
источник
Если вы получаете это сообщение от встроенной войны Maven, измените область действия драйвера JDBC на предоставленную и поместите его копию в каталог lib. Как это:
источник
Решение для развертывания приложений
Это слушатель, который я написал для решения проблемы: он автоматически определяет, зарегистрировался ли драйвер и действует соответственно.
Важный: это предназначено, чтобы использоваться ТОЛЬКО, когда jar драйвера развернут в WEB-INF / lib , а не в Tomcat / lib, как многие предлагают, чтобы каждое приложение могло позаботиться о своем собственном драйвере и работать на нетронутом Tomcat , Именно так и должно быть ИМХО.
Просто настройте прослушиватель в вашем web.xml перед любым другим и наслаждайтесь.
добавить в верхней части web.xml :
сохранить как utils / db / OjdbcDriverRegistrationListener.java :
источник
@WebListener
и не указыватьweb.xml
конфигурацию.Я добавлю к этому то, что я нашел на весенних форумах. Если вы переместите свой драйвер JDBC-драйвера в папку lib tomcat, а не развернете его с помощью веб-приложения, предупреждение, похоже, исчезнет. Я могу подтвердить, что это сработало для меня
http://forum.springsource.org/showthread.php?87335-Failure-to-unregister-the-MySQL-JDBC-Driver&p=334883#post334883
источник
Я обнаружил, что реализация простого метода destroy () для отмены регистрации любых драйверов JDBC прекрасно работает.
источник
Чтобы предотвратить эту утечку памяти, просто отмените регистрацию драйвера при закрытии контекста.
pom.xml
MyWebAppContextListener.java
web.xml
Источник, который вдохновил меня на исправление этой ошибки.
источник
У меня была похожая проблема, но, кроме того, я получал ошибку Java Heap Space каждый раз, когда я изменял / сохранял страницы JSP с запущенным сервером Tomcat, поэтому контекст не был полностью перезагружен.
Моими версиями были Apache Tomcat 6.0.29 и JDK 6u12.
Обновление JDK до 6u21, как предлагается в разделе « Ссылки » URL-адреса http://wiki.apache.org/tomcat/MemoryLeakProtection, решило проблему пространства кучи Java (контекст теперь перезагружается), хотя ошибка драйвера JDBC по-прежнему появляется.
источник
Я обнаружил ту же проблему с Tomcat версии 6.026.
Я использовал Mysql JDBC.jar в библиотеке WebAPP, а также в TOMCAT Lib.
Чтобы исправить вышеперечисленное, удалив Jar из папки lib TOMCAT.
Так что я понимаю, что TOMCAT правильно обрабатывает утечку памяти JDBC. Но если jar-файл MYSQL Jdbc дублируется в WebApp и Tomcat Lib, Tomcat сможет обрабатывать только jar-файл, присутствующий в папке Tomcat Lib.
источник
Я столкнулся с этой проблемой, когда развертывал свое приложение Grails на AWS. Это вопрос драйвера JDBC по умолчанию драйвер org.h2 . Как вы можете видеть это в Datasource.groovy внутри вашей папки конфигурации. Как вы можете видеть ниже:
Прокомментируйте те строки, где есть упоминание org.h2.Driver в файле datasource.groovy , если вы не используете эту базу данных. В противном случае вы должны загрузить этот файл jar базы данных.
Спасибо .
источник
Эта ошибка произошла со мной в приложении Grails с драйвером JTDS 1.3.0 (SQL Server). Проблема заключалась в неправильном входе в SQL Server. После решения этой проблемы (в SQL Server) мое приложение было правильно развернуто в Tomcat. Совет: я видел ошибку в stacktrace.log
источник