Понимание механизма поставщика услуг Java, который автоматически загружает драйвер Jdbc

Я пытаюсь получить точное представление о том, как работает механизм поставщика услуг Java, чтобы найти подходящий драйвер JDBC. Вот что я до сих пор:

Так как Class.ForName больше не используется для явной загрузки JDBC Driver, Java должен знать, какой драйвер типа он нужен из строки url базы данных, которая передается методу getConnection. Например, URL-адрес базы данных для подключения к базе данных оракула будет примерно таким:

public static final String DB_URL = "jdbc:oracle:[email protected]//localhost:1521/ORCL";

Затем DriverManager будет искать реализацию драйвера oracle в банках, указанных в пути класса проектов. Он будет искать файлы конфигурации драйверов (в которых должно быть имя фактических классов драйверов) в каталоге META-INF/Services каждой банки. Class Loader будет загружать самое первое совпадение, которое он находит, и игнорировать остальные.

Является ли вышеуказанная работа точной? Пожалуйста, дайте мне знать Если я пропустил что-то или что-то не так.

Ответ 1

Если вы проверите исходный код, вы увидите, что Java не пытается определить имя реализации драйвера (т.е. класс драйвера) из URL-адреса. Вместо этого он запрашивает каждую реализацию драйвера, которую он находит в пути к классам, если они могут обрабатывать этот URL-адрес или нет.

Порядок действий выглядит следующим образом:

  • Когда вы запрашиваете соединение, загружается класс DriverManager. Он выполняет статический блок, который загружает все классы, указанные в системном свойстве jdbc.drivers
  • Затем запускается механизм поставщика услуг и загружает все классы java.sql.driver, которые он находит в пути к классам.

Теперь, когда вы запрашиваете соединение, он проходит через зарегистрированные драйверы и вызывает Driver.connect(String url, Properties info) метод на них. Цитата:

Попытка подключения базы данных к данному URL-адресу. Водитель должен возвращать "null", если он понимает, что это неправильный тип драйвера для подключитесь к данному URL-адресу. Это будет распространено, например, когда драйвер JDBC менеджер просит подключиться к определенному URL-адресу, он передает URL-адрес каждому загруженный драйвер в свою очередь.

Водитель должен выбросить SQLException, если это правильный драйвер для подключитесь к данному URL-адресу, но у вас возникли проблемы с подключением к базе данных.

Таким образом, первым драйвером, который возвращает соединение без null, является используемый драйвер.

Надеюсь, что поможет