Какова цель класса 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
источник

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
источник
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
источник
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
источник