Когда Class.forName необходим при подключении к базе данных через JDBC в веб-приложении?

#mysql #tomcat #jdbc

#mysql #tomcat #jdbc

Вопрос:

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

mysql-connector-java-5.1.18-bin.jar Файл был в tomcatwebappsDatabaseProjectWEB-INFlib , я трижды проверил, но он не работал, поэтому я начал пробовать что-то еще. Я добавил вызов Class.forName , и это сработало. Это было единственное, что изменилось.

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

Ответ №1:

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

META-INF/services/java.sql.Driver

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

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

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

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

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

Комментарии:

1. Я только что это увидел, большое спасибо за ответ! Я действительно ценю это. Я попробую это позже и посмотрю, поможет ли это мне точно определить проблему.