Contents | Prev | Next | Главная страница JDBCTM Guide: Getting Started


3 - Класс DriverManager

3.1 Обзор

Класс DriverManager является уровнем управления в JDBC и находится между пользователем и драйверами. Он отслеживает все доступные драйверы и управляет установлением соединений между БД и соответствующим драйвером. К тому же, класс DriverManager заботится о таких вещах, как максимальное время логина к БД и вывод отладочной информации в журнал.

Для простых приложений единственный полезный метод в этом классе - это DriverManager.getConnection. Как можно догадаться по его имени, он устанавливает соединение с БД. JDBC позволяет пользователю вызывать также следующие методы DriverManager: getDriver, getDrivers и registerDriver, и метод connect интерфейса Driver, но в большинстве случаев лучше возложить подробности установления соединения на класс DriverManager.

3.1.1 Отслеживание доступных драйверов

Класс DriverManager хранит список объектов типа Driver, которые зарегистрировались с помощью вызова DriverManager.registerDriver. Все классы драйверов Driver должны быть написаны со статической секцией инициализации, в которой экземпляр данного класса создается и регистрируется в классе DriverManager при загрузке. Таким образом, пользователь не должен вызывать DriverManager.registerDriver непосредственно; этот вызов автоматически делается самим драйвером при загрузке класса драйвера. Класс же загружается двумя способами:

  1. С помощью вызова Class.forName. Рекомендуется именно этот способ. Следующий код загружает класс acme.db.Driver:
        Class.forName("acme.db.Driver");
    
    Только после этого драйвер появляется в списке зарегистрированных драйверов в классе DriverManager и становится возможным открывать соединения.

  2. Добавлением драйвера в свойство jdbc.drivers класса java.lang.System. Это список классов драйверов, разделенных двоеточиями, которых подгружает DriverManager при инициализации. Следующий пример показывает, как программист может ввести три класса драйверов в файл ~/.hotjava/properties (HotJava загружает его при запуске в системные свойства):
     jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver
Первый же вызов метода класса DriverManager повлечет за собой загрузку и регистрацию этих драйверов.

Этот второй способ требует наличия постоянных настроек окружения. Если есть сомнения, что эти настройки постоянно имеются, то лучше вызывать Class.forName.

В обеих случаях за регистрацию нового драйвера отвечает сам драйвер: он должен вызывать DriverManager.registerDriver, и, как уже отмечалось, этот вызов должен происходить автоматически при загрузке класса драйвера.

С целью обоспечения безопасности уровень управления JDBC отслеживает, каким загрузчиком классов (class loader) загружен каждый драйвер. Для открытия соединений используются только драйверы, поступившие либо из локальной файловой системы, либо загруженные тем же загрузчиком, которым загружен код, запросивший соединение с БД.

3.1.2 Установление соединения

Устанавлиавать соединения с БД можно сразу после загрузки и регистрации классов Driver. Когда методу DriverManager.getConnection передается запрос на соединение с БД, DriverManager опрашивает каждый драйвер с целью определить, который из них может установить данное соединение.

Иногда может оказаться, что открыть соединения согласно данному URL могут более одного драйвера JDBC. В этом случае важен порядок, в котором происходит этот опрос, так как DriverManager будет использовать первый драйвер, откликнувшийся на URL.

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

Для всех драйверов вызываются методы Driver.connect, которым передается тот же URL, что и методу DriverManager.getConnection. Первый же драйвер, который "понимает" URL, открывает соединение.

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

Следующий код демонстрирует соединение с мостом JDBC-ODBC:

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  // загружаем драйвер
    String url = "jdbc:odbc:fred";
    DriverManager.getConnection(url, "userID", "passwd");


Содержание | Предыдущий | Следующий