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

17

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

Однако при использовании 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; мне нужно изменить строку имени драйвера в системном свойстве?

    
задан Kanagavelu Sugumar 05.10.2011 в 16:26
источник
  • Группа, спасибо. Теперь я понял, что class.forName () полезен для загрузки класса по сравнению с другими механизмами, такими как вызов его статического метода или создание экземпляра этого класса. Таким образом, мы можем обеспечить выполнение некоторых функций только один раз, используя статический блок во время загрузки. –  Kanagavelu Sugumar 06.10.2011 в 09:28

4 ответа

22

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

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

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

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

    
ответ дан Joachim Sauer 05.10.2011 в 16:31
источник
  • Да! в java6 без класса Class.forName (); DriverManager может создать соединение для драйвера oracle. Я просто испытал. Это делается с помощью loadInitialDrivers () :: DriverManager. Благодаря! –  Kanagavelu Sugumar 05.03.2013 в 09:23
  • @Joachim, комментарий JustinK stackoverflow.com/questions/8053095/... гласит, что как и для предварительного JDBC 4, Class.forName нужен только тогда, когда драйвер не находится в пути к классам. Почему комментарий JustinK прямо противоречит вашей цитате, в которой говорится, что «всегда будет нужен драйвер JDBC в пути к классам»? –  Pacerier 25.08.2014 в 00:36
  • @Pacerier: JustinK говорит о наличии драйвера на пути к классу при создании кода. Это никогда не понадобится, если вы каким-либо образом не получите доступ к классу драйверов напрямую (для этого вам может понадобиться доступ к некоторым нестандартным функциям, но это маловероятно). Во время выполнения вам нужно иметь драйвер на пути к классам (или, может быть, на пользовательском загрузчике классов, если вы предпочитаете, но это почти то же самое эффективно) независимо от того, как вы к нему обращаетесь, иначе он не может быть загружен. –  Joachim Sauer 25.08.2014 в 01:00
  • @JoachimSauer, True на этом, и да, поскольку пользовательские загрузчики классов широко используются, ваш оператор «вам всегда понадобится драйвер JDBC в пути к классам» должен быть отредактирован. Это неправильно, потому что нам вообще не нужен драйвер в пути к классам, поскольку с помощью загрузчика классов мы можем загрузить драйвер JDBC через файл / память / сеть / пользовательский ввод. (Кстати, извинения за поздний ответ, символ «:», похоже, не работает с «@») –  Pacerier 25.08.2014 в 23:47
12

В вызове 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. Вот пример .

    
ответ дан Eugene Kuleshov 05.10.2011 в 16:30
источник
  • технически это вызывается при загрузке класса, не обязательно в Class.forName (), что является всего лишь одним из способов принудительно загрузить загруженный класс. –  Carlos Heuberger 05.10.2011 в 16:53
4

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

    
ответ дан JB Nizet 05.10.2011 в 16:32
источник
2

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

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

    
ответ дан Jay Patel - PayPal 05.10.2011 в 19:48
источник