Согласно документации Tomcat 8 на JNDI Datasources , поведение по умолчанию для загрузки драйверов с использованием DriverManager
- это чтение их из папки Apache-Tomcat-Home/lib
.В противном случае вам придется явно зарегистрировать драйвер (ы).Это в основном связано с механизмом загрузки классов Tomcat.Вот выдержка из документации:
Слушатель предотвращения утечек памяти JRE, включенный в Apache Tomcat, решает эту проблему, инициируя сканирование драйверов во время запуска Tomcat.Это включено по умолчанию.Это означает, что только библиотеки, видимые для слушателя, такие как библиотеки в $ CATALINA_BASE / lib, будут проверены на наличие драйверов базы данных.Если вы рассматриваете возможность отключения этой функции, обратите внимание, что сканирование будет запускаться первым веб-приложением, использующим JDBC, что приведет к сбоям при перезагрузке этого веб-приложения и других веб-приложений, использующих эту функцию.
Таким образом, веб-приложения, которые имеют драйверы базы данных в своем каталоге WEB-INF / lib, не могут полагаться на механизм поставщика услуг и должны явно регистрировать драйверы.Это поведение должно применяться к более новым версиям Tomcat.
Ключевым моментом здесь является поведение Слушатель предотвращения утечки памяти при поиске драйверов базы данных с использованием DriverManager
.Этот слушатель, согласно документации:
предоставляет обходные пути для известных мест, где среда выполнения Java использует загрузчик класса контекста для загрузки одиночного файла, поскольку это вызовет утечку памяти, если класс веб-приложенияВ данный момент loader является загрузчиком класса контекста.Обходной путь - инициализировать эти синглтоны, когда этот слушатель запускается, так как общий загрузчик классов Tomcat является загрузчиком классов контекста в то время.
Но в вашем случае, как в моем случае, я смогПовторно выдавая ошибку, загрузчик класса веб-приложения отличался от загрузчика класса контекста и, следовательно, не нашел драйвер.Поэтому решение состоит в том, чтобы настроить прослушиватель на отключение защиты DriverManager
- по умолчанию установлено значение true
.Это можно сделать, установив для свойства driverManagerProtection
значение false
в файле Apache-Tomcat-Home/conf/server.xml
:
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" driverManagerProtection="false"/>
При этом я не верю, что DriverManager
является правильным способом создания экземпляра базы данных.соединения в веб-сервере;Соединения с базой данных стоят дорого.Я бы рекомендовал использовать DataSource
, который объединяет соединения и, следовательно, улучшает производительность.См. Приведенную ссылку на документацию для примеров.
Однако я верю, что каждая технология имеет свое место.Итак ... Я оставлю это на ваше усмотрение, чтобы решить, что работает в вашем случае.Но, по крайней мере, у вас есть ответ.