Загрузка драйвера JDBC
Мне сказали, что предпочтительным методом загрузки драйвера JDBC является:
Class.forName(driverName);
Я понимаю, что это лучше для динамического решения нескольких драйверов, возможно, прочитанных из файла конфигурации XML или ввода пользователем. То, что мне интересно, - это то, как вызов этого оператора загружает указанный драйвер в среду, где мы даже не сохраняем результирующий объект класса в любом месте. В записи JavaDocs говорится:
public static Class forName(String className)
throws ClassNotFoundExceptionReturns
возвращает объект класса, связанный с классом или интерфейсом, с заданным именем строки
В этом случае, как разработчикам Java удалось облегчить существование объекта драйвера только с этим утверждением?
Ответы
Ответ 1
Class#forName()
запускает статические инициализаторы (вы знаете, static
применяется к классу, а не к экземпляру). Реализация драйвера JDBC должна регистрироваться в статическом инициализаторе.
public class SomeDriver implements Driver {
static {
DriverManager.registerDriver(new SomeDriver());
}
}
Обратите внимание, что существуют багги-драйверы JDBC, такие как org.gjt.mm.mysql.Driver
, которые неправильно регистрируются внутри конструктора. Для этого вам понадобится вызов newInstance()
после этого на таких драйверах, чтобы заставить их зарегистрироваться.