JDBC Class.forName vs DriverManager.registerDriver

Какая разница от метода forName vs registerDriver для загрузки и регистрации драйвера JDBC?

Ответ 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).