2011-10-05 4 views
17

Насколько я понимаю, загрузка классов полезна для загрузки класса во время выполнения с его именем класса.Какова цель класса Class.forName («MY_JDBC_DRIVER»)?

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

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

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

Edit 1:

В DriverManager API doc говорится, что

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

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

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

+0

Группа, спасибо. Теперь я понял, что class.forName() полезен для загрузки класса по сравнению с другими механизмами, такими как вызов его статического метода или создание экземпляра этого класса. Таким образом, мы можем обеспечить выполнение некоторых функций только один раз, используя статический блок во время загрузки. –

ответ

22

Первый из них: с современными драйверами JDBC и текущим JDK (по крайней мере, Java 6) больше не нужен звонок Class.forName(). JDBC driver classes are now located с использованием service provider mechanism. Вам должен уметь просто удалить этот вызов и оставить остальную часть кода без изменений и продолжить работу.

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

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

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

+1

Да! в java6 без класса Class.forName(); DriverManager может создать соединение для драйвера oracle. Я просто испытал. Это делается с помощью loadInitialDrivers() :: DriverManager. Благодаря! –

+0

@Joachim, комментарий JustinK http://stackoverflow.com/questions/8053095/what-is-the-actual-use-of-class-fornameoracle-jdbc-driver-oracledriver-while#comment-9863309 гласит, что как для pre JDBC 4, 'Class.forName' ** требуется только тогда, когда ** драйвер не находится в пути к классам. Почему комментарий JustinK прямо противоречит вашей цитате, в которой говорится, что «всегда будет нужен драйвер JDBC в пути к классам»? – Pacerier

+0

@Pacerier: JustinK говорит о наличии драйвера в classpath * при создании кода *. Это никогда не понадобится, если вы каким-либо образом не получите доступ к классу драйверов напрямую (для этого вам может понадобиться доступ к некоторым нестандартным функциям, но это маловероятно). Во время выполнения вам нужно иметь драйвер на пути к классам (или, может быть, на пользовательском загрузчике классов, если вы предпочитаете, но это почти то же самое эффективно) независимо от того, как вы к нему обращаетесь, иначе он не может быть загружен. –

12

Class.forName (JDBC_DRIVER) вызов будет зарегистрировать драйвер JDBC в DriverManager, так что вы можете адресовать его по URL, такие как «JDBC: ODBC: База данных» и так далее ...

Обычно класс драйвера имеет статический код инициализации, как это, который вызывается на 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. Вот example.

+2

технически это вызывается при загрузке класса, не обязательно в 'Class.forName()', что является всего лишь одним из способов принудительно загрузить загруженный класс. –

4

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

2

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

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

Смежные вопросы