1. введение
JDBC-это набор спецификаций, определяющих части API и SPI контракта на подключение к базе данных Java . Стандарт определяет абстракцию драйвера JDBC в качестве основной точки входа для взаимодействия с базой данных.
В этом руководстве мы рассмотрим некоторые основные шаги, необходимые для загрузки драйверов JDBC.
2. Драйверы JDBC
Чтобы подключиться к базе данных, мы должны получить экземпляр драйвера JDBC.
Мы можем получить его через Диспетчер драйверов , указав строку подключения URL-адреса JDBC. Такой URL-адрес содержит тип компонента database engine, имя базы данных, имя хоста и порт, а также другие параметры подключения, характерные для поставщика базы данных.
Используя строку подключения, мы можем получить объект подключения к базе данных, который является базовой единицей связи с базой данных в 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; } }
В приведенном выше примере показана регистрация драйвера JDBC Postgres в Диспетчере драйверов . Он запускается JVM как часть статического инициализатора.
Этот шаг можно частично автоматизировать даже при использовании устаревшего подхода , установив системное свойство jdbc.drivers :
java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver
Когда это свойство указано, диспетчер драйверов автоматически попытается загрузить указанный драйвер JDBC.
4. Подход JDBC 4
Проблема автоматического обнаружения служб была решена с помощью Java 1.6 и механизма поставщика услуг . Это позволяет поставщикам услуг объявлять о своих услугах, помещая их в META-INF/услуги внутри файла JAR, содержащего услуги.
Этот механизм автоматически регистрирует драйвер, так что ручной шаг для загрузки класса больше не требуется. Однако даже при наличии поставщика услуг загрузка классов вручную не приведет к сбою. Совершенно законно явно вызывать загрузку драйверов с помощью последних драйверов JVM и JDBC 4.
Спецификация поставщика услуг просто заменяет ручную загрузку классов декларативным подходом. Например, драйвер JDBC PostgreSQL содержит один файл в META-INF/services/ . Имя файла java.sql.Driver (что является общепринятым соглашением для драйверов JDBC). Он содержит полное имя класса драйвера JDBC, которое в данном случае является org.postgresql.Driver .
5. Заключение
В этой статье мы рассмотрели основные концепции JDBC, а также различные методы загрузки драйверов JDBC с объяснением каждого подхода.
Как обычно, полный исходный код статьи доступен на GitHub .