Драйверы 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.