Подтвердить что ты не робот

Почему драйвер JDBC должен быть помещен в папку TOMCAT_HOME/lib?

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

4b9b3361

Ответ 1

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

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

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

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

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