Почему драйвер JDBC должен быть помещен в папку TOMCAT_HOME / lib? - PullRequest
40 голосов
/ 08 августа 2011

У меня странная проблема, когда два веб-приложения с драйвером Oracle JDBC конфликтуют друг с другом.Я должен поместить JAR-файл драйвера JDBC в общую папку TOMCAT_HOME / lib .В чем причина?

1 Ответ

77 голосов
/ 26 августа 2011

Драйверы JDBC регистрируются в едином узле JVM DriverManager, который совместно используется всеми веб-приложениями. Если у вас один и тот же (как в названии класса) драйвер JDBC, зарегистрированный дважды в двух разных веб-приложениях, это может вызвать вашу проблему. Это еще более проблематично, если ваши веб-приложения используют разные версии одного и того же драйвера JDBC.

Кроме того, размещение драйверов JDBC в папке lib Tomcat поможет предотвратить утечки памяти при повторном развертывании веб-приложения без перезапуска Tomcat, например. если вы просто поместите новый WAR-файл в папку веб-приложений Tomcat:

Класс DriverManager загружается загрузчиком классов начальной загрузки и таким образом «живет» глобально в JVM, в то время как Tomcat загружает все веб-приложения в свои собственные загрузчики классов. Поэтому, если драйвер JDBC из папки WEB-INF / lib веб-приложения регистрируется в DriverManager, он закрепляет загрузчик классов этого веб-приложения в памяти (и, следовательно, все классы этого веб-приложения), предотвращая его сборку мусора.

Если вместо этого драйверы DriverManager и JDBC поступают из загрузчиков классов, не относящихся к веб-приложениям, вы можете свободно повторно развертывать свои веб-приложения без каких-либо классов веб-приложений, закрепляющих себя в классах, загруженных из других загрузчиков классов.

Текущие версии Tomcat (вероятно, 6.x и, определенно, 7.x) будут регистрировать предупреждения об отключении веб-приложения в случае обнаружения утечки памяти, в том числе драйверами JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...