Какая разница от метода forName
vs registerDriver
для загрузки и регистрации драйвера JDBC?
JDBC Class.forName vs DriverManager.registerDriver
Ответ 1
Class.forName()
не имеет прямого отношения к JDBC. Он просто загружает класс.
Большинство классов драйвера JDBC регистрируются в своих статических инициализаторах, вызывая registerDriver()
.
registerDriver()
- это реальный вызов, который вам вряд ли когда-либо понадобится для вызова (если вы не пишете собственный драйвер JDBC).
Обратите внимание, что в JDBC 4 вам не нужно ни одного из них, если ваш JDBC-драйвер обновлен, поскольку драйверы могут быть найдены с использованием механизмов местоположения службы (т.е. просто оставить этот вызов и открыть ваше соединение как обычно). Подробнее о documentaton DriverManager
:
Методы DriverManager
getConnection
иgetDrivers
были расширены для поддержки механизма поставщика услуг Java Standard Edition. Драйверы JDBC 4.0 должны включать файлMETA-INF/services/java.sql.Driver
. Этот файл содержит имя реализации JDBC-драйверовjava.sql.Driver
. Например, чтобы загрузить классmy.sql.Driver
, файлMETA-INF/services/java.sql.Driver
будет содержать запись:my.sql.Driver
Приложениям больше не нужно явно загружать драйверы JDBC с помощью
Class.forName()
. Существующие программы, которые в настоящее время загружают драйверы JDBC с помощьюClass.forName()
, будут продолжать работать без изменений.
Ответ 2
Никогда не вызывайте метод DriverManager.registerDriver()
вручную. Спецификация JDBC требует, чтобы драйвер регистрировался при загрузке класса, а класс загружался через Class.forName()
. В JDBC 4 драйверы можно загружать автоматически, просто находясь на пути к классу.
DriverManager.registerDriver()
вручную потенциально опасен, поскольку он фактически заставляет Драйвер регистрироваться дважды. Если ваш код требует от вас отменить регистрацию драйвера, чтобы предотвратить утечку памяти, вы только закончите его регистрацию один раз и оставите зарегистрированный второй экземпляр.
Ответ 3
В дополнение к тому, что Joachim Sauer уже упомянул о драйверах JDBC 4, обратите внимание, что на практике обычно вы хотите впрыскивать либо EntityManager (JPA), либо объединенный DataSource (и использовать JdbcTemplate из Spring).