Когда требуется Class.forName при подключении к базе данных через JDBC в веб-приложении? - PullRequest
3 голосов
/ 10 ноября 2011

Согласно этому руководству , вызов Class.forName больше не требуется с драйверами JDBC 4.0+.Я успешно следовал методу в примере (просто вызывая DriverManager.getConnection) для автономной программы, использующей MySQL, но когда я попытался подключиться к той же самой базе данных из класса, который был частью веб-приложения, работающего на Tomcat 7,это не сработает;вместо этого я получил исключение No suitable driver found.

Файл mysql-connector-java-5.1.18-bin.jar был в tomcat\webapps\DatabaseProject\WEB-INF\lib, я трижды проверил, но он не работал, поэтому я начал что-то пробовать.Я добавил вызов на Class.forName, и это сработало.Это было единственное, что изменилось.

В любом случае, мой вопрос: кто-нибудь знает, почему это сработало или что здесь происходит?Моя единственная теория заключается в том, что у меня также есть hsqldb.jar в tomcat\lib для другого проекта и, возможно, драйверы запутались?Но у меня сложилось впечатление, что DriverManager должен автоматически определять, какой драйвер использовать, так что это не должно быть проблемой ... В любом случае, если кто-то сможет объяснить мне, что здесь происходит, я был бы очень признателенэто.

1 Ответ

3 голосов
/ 23 января 2012

Драйверы JDBC4 включают в себя файл:

META-INF/services/java.sql.Driver

в jar, который использует механизм ServiceProvider для регистрации реализации драйвера с помощью JVM (см. Javadocs для java.util.ServiceLoader ).Вот почему Class.forName больше не нужен.

Я думаю, что это проблема загрузчика классов.В ServiceLoader javadoc упоминается, что:

Поставщик должен быть доступен из того же загрузчика классов, который первоначально запрашивался для поиска файла конфигурации;обратите внимание, что это не обязательно загрузчик классов, из которого файл был фактически загружен.

Я бы попытался поместить ваш драйвер в каталог tomcat\lib, а не в каталог веб-приложения, чтобы увидеть, не создает ли онРазница (другой загрузчик классов?).

Если вы запускаете свое веб-приложение через ide и устанавливаете точку останова, как только вы достигнете точки останова, вы можете использовать функцию «вычисления выражения» для выполнения: ServiceLoader.load(Driver.class).Это даст вам класс ServiceLoader, в который вы можете посмотреть, какие драйверы зарегистрированы.Вы можете проверить, есть ли драйвер mysql, где он находится в списке и т. Д., Что может помочь выяснить поведение здесь.

...