Руководство по JDBC v.1
Предыдущий | Содержание | Следующий
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
непосредственно; этот вызов
автоматически делается самим драйвером при загрузке класса драйвера. Класс же
загружается двумя способами:
- С помощью вызова
Class.forName
. Рекомендуется именно этот способ. Следующий код загружает классacme.db.Driver
:Class.forName("acme.db.Driver");
Только после этого драйвер появляется в списке зарегистрированных драйверов в классеDriverManager
и становится возможным открывать соединения. - Добавлением драйвера в свойство
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");
Предыдущий | Содержание | Следующий