HEAD>
Contents | Prev | Next | JDBCTM Guide: Getting Started |
DriverManager
является уровнем управления в
JDBC и находится между пользователем и драйверами. Он отслеживает все доступные
драйверы и управляет установлением соединений между БД и соответствующим
драйвером. К тому же, класс DriverManager
заботится о таких вещах,
как максимальное время логина к БД и вывод отладочной информации в журнал.
Для простых приложений единственный полезный метод в этом классе - это
DriverManager.getConnection
. Как можно догадаться по его имени, он
устанавливает соединение с БД. JDBC позволяет пользователю вызывать также
следующие методы DriverManager
: getDriver
,
getDrivers
и registerDriver
, и метод
connect
интерфейса Driver
, но в большинстве случаев
лучше возложить подробности установления соединения на класс
DriverManager
.
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) загружен каждый драйвер. Для открытия соединений используются только драйверы, поступившие либо из локальной файловой системы, либо загруженные тем же загрузчиком, которым загружен код, запросивший соединение с БД.
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");