1. Введение
JDBC — это набор спецификаций, определяющих части API и SPI контракта для Java Database Connectivity . Стандарт определяет абстракцию драйвера JDBC как основную точку входа для взаимодействия с базой данных.
В этом руководстве мы рассмотрим некоторые основные шаги, необходимые для загрузки драйверов JDBC.
2. Драйверы JDBC
Чтобы подключиться к базе данных, мы должны получить экземпляр драйвера JDBC.
Мы можем получить его через DriverManager
, указав строку подключения URL-адреса JDBC. Такой URL-адрес содержит тип ядра базы данных, имя базы данных, имя хоста и порт, а также другие параметры подключения, характерные для поставщика базы данных.
Используя строку подключения, мы можем получить объект подключения к базе данных, который является базовой единицей связи с базой данных в JDBC :
Connection con = DriverManager.getConnection(
"jdbc:postgresql://localhost:21500/test?user=fred&password=secret&ssl=true");
Как диспетчер драйверов узнает, какой драйвер использовать, если единственным указанием является указанный URL-адрес?
В пути к классам может быть много драйверов JDBC, поэтому должен быть способ уникально различать каждый драйвер.
3. Устаревший подход
До JDBC версии 4 и Java SE 1.6 в JVM не было универсального механизма, который позволял бы автоматически обнаруживать и регистрировать службы. Из-за этого потребовался ручной шаг для загрузки класса драйвера JDBC по имени :
Class.forName("oracle.jdbc.driver.OracleDriver");
Процесс загрузки класса запускает статическую процедуру инициализации, которая регистрирует экземпляр драйвера в DriverManager
и связывает этот класс с идентификатором ядра базы данных, таким как oracle
или postgres
.
После завершения регистрации мы можем использовать этот идентификатор внутри URL-адреса JDBC как jdbc:oracle
.
Типичная процедура регистрации драйвера создает экземпляр драйвера и передает его методу DriverManager.registerDriver
:
public static void register() throws SQLException {
if (isRegistered()) {
throw new IllegalStateException("Driver is already registered. It can only be registered once.");
} else {
Driver registeredDriver = new Driver();
DriverManager.registerDriver(registeredDriver);
Driver.registeredDriver = registeredDriver;
}
}
В приведенном выше примере показана регистрация драйвера Postgres JDBC с помощью DriverManager
. Он запускается JVM как часть статического инициализатора.
Можно частично автоматизировать этот шаг даже при устаревшем подходе , установив системное свойство jdbc.drivers
:
java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver
Если это свойство указано, диспетчер драйверов автоматически попытается загрузить указанный драйвер JDBC.
4. Подход JDBC 4
Проблема автоматического обнаружения сервисов была решена с помощью Java 1.6 и механизма сервис-провайдера . Это позволяет поставщикам услуг объявлять свои службы, помещая их в META-INF/services
внутри файла JAR, содержащего службы.
Этот механизм автоматически регистрирует драйвер, поэтому ручной шаг для загрузки класса больше не требуется. Однако даже при наличии поставщика услуг ручная загрузка классов не приведет к сбою. Совершенно законно явно вызывать загрузку драйвера с последними драйверами JVM и JDBC 4.
Спецификация поставщика услуг просто заменяет ручную загрузку классов декларативным подходом. Например, драйвер JDBC PostgreSQL имеет один файл в папке META-INF/services/
. Имя файла — java.sql.Driver
(устоявшееся соглашение для драйверов JDBC). Он содержит полное имя класса драйвера JDBC, в данном случае это org.postgresql.Driver
.
5. Вывод
В этой статье мы рассмотрели основные концепции JDBC, а также различные методы загрузки драйверов JDBC с объяснением каждого подхода.
Как обычно, полный исходный код статьи доступен на GitHub .