Синтаксис и анатомия строки соединения JDBC

На протяжении многих лет я использовал JDBC для подключения ко многим различным реляционным системам: H2, HSQLDB, MySQL, Oracle, Postgres и т. Д. И в каждом случае у каждой системы свой синтаксис строки подключения.

Я не могу себе представить, что у давнишнего API, такого как JDBC , не было бы определенной, принудительной грамматики для проверки строки соединения. Например:

Некоторые допустимые строки подключения HSQLDB:

jdbc:hsqldb:mem:mymemdb
jdbc:hsqldb:res:org.my.path.resdb
jdbc:hsqldb:file:/opt/db/testdb

MySQL:

jdbc:mysql://localhost/test

Postgres:

jdbc:postgresql://localhost/test

H2:

jdbc:h2:~/test
jdbc:h2:file:/data/sample
jdbc:h2:tcp://dbserv:8084/~/sample

Из всех этих примеров я собираю основной обобщенный синтаксис:

jdbc:<vendor>:<vendor-specific-uri>

куда <vendor> это название системы (h2, mysql и т. д.) и <vendor-specific-uri> это либо путь, либо какой-то специфичный для поставщика способ определения местоположения базы данных.

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

  • Какова общая грамматика / определение допустимой строки соединения JDBC?
  • Каковы разные имена каждого токена / компонента строки соединения? Например, это " jdbc: "что-то называется, например," протокол JDBC "? Какое собственное имя для моего <vendor> а также <vendor-specific-uri> сегменты?

2 ответа

Решение

Синтаксис URL-адреса указан в спецификации JDBC, в частности в разделе 9.4:

Формат URL JDBC:

jdbc:<subprotocol>:<subname>

где subprotocol определяет тип механизма подключения к базе данных, который может поддерживаться одним или несколькими драйверами. Содержание и синтаксис subname будет зависеть от подпротокола.

Примечание. URL JDBC не требуется для полного соответствия синтаксису URI, как определено в RFC 3986, Универсальный идентификатор ресурса (URI): Общий синтаксис

Нет более формальности, чем эта. Подпротоколом обычно является некоторый идентификатор для базы данных или драйвера. Subname является свободной формой, хотя драйверы обычно следуют URI-подобному синтаксису.

Также не нужно больше формальностей. DriverManager просто предложит URL каждому зарегистрированному java.sql.Driver в свою очередь, и первый, кто принимает, используется для подключения.

Если вы посмотрите на исходный код, вы увидите, что драйвер JDBC реализует java.sql.Driver, Этот интерфейс имеет метод

boolean acceptsURL(String url) throws SQLException;

Из JavaDoc:

Получает, считает ли драйвер, что он может открыть соединение с заданным URL-адресом. Как правило, драйверы вернутся true если они понимают подпротоколы, указанные в URL и false если они этого не делают.

Таким образом, dirver для вашей базы данных отвечает за реализацию этого метода. Для H2 эта реализация

@Override
public boolean acceptsURL(String url) {
    if (url != null) {
        if (url.startsWith(Constants.START_URL)) {
            return true;
        } else if (url.equals(DEFAULT_URL)) {
            return DEFAULT_CONNECTION.get() != null;
        }
    }
    return false;
}

Другие СУБД имеют разные реализации.

Изменить: для H2, константа Constants.START_URL является "jdbc:h2:", Так что даже ведущий jdbc не является частью какой-либо формальной грамматики.

Другие вопросы по тегам