Синтаксис и анатомия строки соединения 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
не является частью какой-либо формальной грамматики.