#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. Я только что это увидел, большое спасибо за ответ! Я действительно ценю это. Я попробую это позже и посмотрю, поможет ли это мне точно определить проблему.