Какова цель "Class.forName (" MY_JDBC_DRIVER ")"? - PullRequest
21 голосов
/ 05 октября 2011

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

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

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

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

Редактировать 1:

API 1018 * документ гласит, что

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

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

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

Ответы [ 4 ]

24 голосов
/ 05 октября 2011

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

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

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

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

12 голосов
/ 05 октября 2011

Вызов 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!");
     }
   }
 }

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

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

4 голосов
/ 05 октября 2011

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

2 голосов
/ 05 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...