Подтвердить что ты не робот

Какова цель класса Class.forName( "MY_JDBC_DRIVER" )?

Я понимаю, что загрузка классов полезна для загрузки класса во время выполнения с его именем класса.

Однако при использовании JDBC в нашем проекте мы знаем, какой драйвер мы будем использовать, и в основном строка драйвера управляется жестко.

Мой вопрос: зачем мы загружаем драйвер, используя Class.forName("JDBC_DRIVER") здесь?
Почему мы не можем добавить драйвер в путь класса? так как мы знаем, какую драйверную банку мы будем использовать.

Я считаю, что Class.forName(JDBC_DRIVER) загрузит драйвер в DriverManager. Это единственная причина?

Изменить 1:

DriverManager API doc утверждает, что

Как часть его инициализации (DriverManager), класс DriverManager попытается загрузить классы драйверов, указанные в системном свойстве "jdbc.drivers".

Приложениям больше не нужно явно загружать драйверы JDBC с помощью Class.forName(). Существующие программы, которые в настоящее время загружают драйверы JDBC с помощью Class.forName(), будут продолжать работать без изменений.

Тогда, когда я использую драйвер, отличный от oracle; мне нужно изменить строку имени драйвера в системном свойстве?

4b9b3361

Ответ 1

Первое: с современными драйверами JDBC и текущим JDK (по крайней мере, с Java 6) вызов Class.forName() больше не нужен. Теперь существуют классы драйверов JDBC, используя механизм поставщика услуг. Вы должны просто удалить этот вызов и оставить остальную часть кода без изменений и продолжить работу.

Если вы не используете текущий JDK (или если у вас есть драйвер JDBC, у которого нет соответствующих файлов, настроенных для использования этого механизма), то драйвер должен быть зарегистрирован с помощью DriverManager, используя registerDriver. Этот метод обычно вызывается из блока статического инициализатора фактического класса драйвера, который запускается при первом загрузке класса, поэтому выдача Class.forName() гарантирует, что драйвер регистрирует себя (если он еще не был выполнен).

И независимо от того, используете ли вы Class.forName() или новый механизм поставщика услуг, вам всегда будет нужен драйвер JDBC в пути к классам (или доступен через некий ClassLoader во время выполнения, по крайней мере).

tl; dr: да, единственным использованием этого вызова Class.forName() является обеспечение регистрации драйвера. Если вы используете текущие JDK и текущие JDBC-драйверы, тогда этот вызов больше не понадобится.

Ответ 2

В вызове Class.forName(JDBC_DRIVER) будет зарегистрирован ваш драйвер JDBC в DriverManager, поэтому вы можете адресовать его по URL-адресу, например, "jdbc: odbc: Database" и т.д....

Обычно класс драйвера имеет статический код инициализации, подобный этому, который вызывается в Class.forName():

 public class Driver implements java.sql.Driver {
   static {
     try {
        DriverManager.registerDriver(new Driver());
     } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
     }
   }
 }

Вам все равно придется поместить JDBC-драйвер в путь к классам.

В качестве альтернативы вы можете использовать DataSource, специфичный для базы данных, тогда вы можете декларативно указать тип источника данных, например, в контексте Spring или на вашем веб-сервере JNDI. Вот пример .

Ответ 3

Поместить класс в путь к классам недостаточно, чтобы загрузить его загрузчиком класса. И класс драйвера должен быть загружен, чтобы убедиться, что он зарегистрирован в JDBC API. BTW, для Class.forName для работы класс драйвера должен находиться в пути к классам.

Ответ 4

Во многих промышленных приложениях мы хотели бы абстрагировать уровень доступа к данным от остальной части кода, вытащив такую ​​информацию в виде файла файла/файла свойств. В таких случаях нам может понадобиться использовать что-то, как вы это сделали.

Например, мы можем использовать классы интерфейса JDBC для записи кода для доступа к базе данных, где вы можете настроить свойства, выбрав, какую технологию вы хотите использовать в качестве базы данных (например, драйвер ojdbc или драйвер mysql jdbc и т.д.). В таких случаях вы может загрузить класс, используя такой метод.