Перейти к основному содержимому

Формат URL-адреса JDBC для разных баз данных

· 8 мин. чтения

1. Обзор

Когда мы работаем с базой данных на Java, обычно мы подключаемся к базе данных с помощью JDBC .

URL-адрес JDBC является важным параметром для установления соединения между нашим Java-приложением и базой данных. Однако формат URL-адреса JDBC может различаться для разных систем баз данных.

В этом руководстве мы более подробно рассмотрим форматы URL-адресов JDBC нескольких широко используемых баз данных: Oracle , MySQL , Microsoft SQL Server и PostgreSQL .

2. Форматы URL-адресов JDBC для Oracle

Системы баз данных Oracle широко используются в корпоративных Java-приложениях. Прежде чем мы сможем взглянуть на формат URL-адреса JDBC для подключения баз данных Oracle, мы должны сначала убедиться, что драйвер базы данных Oracle Thin находится в нашем пути к классам.

Например, если нашим проектом управляет Maven, нам нужно добавить зависимость ojdbc8 в наш pom.xml :

<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>

Драйвер Thin предлагает несколько форматов URL-адресов JDBC:

Далее мы рассмотрим каждый из этих форматов.

2.1. Подключиться к SID базы данных Oracle

В некоторых старых версиях базы данных Oracle база данных определяется как SID. Давайте посмотрим на формат URL-адреса JDBC для подключения к SID:

jdbc:oracle:thin:[<user>/<password>]@<host>[:<port>]:<SID>

Например, если у нас есть хост сервера базы данных Oracle « myoracle.db.server:1521 », а имя SID — « my_sid », мы можем следовать указанному выше формату, чтобы создать URL-адрес подключения и подключиться к базе данных:

@Test
public void givenOracleSID_thenCreateConnectionObject() {
String oracleJdbcUrl = "jdbc:oracle:thin:@myoracle.db.server:1521:my_sid";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}

2.2. Подключиться к имени службы базы данных Oracle

Формат URL-адреса JDBC для подключения к базам данных Oracle через имя службы очень похож на тот, который мы использовали для подключения через SID:

jdbc:oracle:thin:[<user>/<password>]@//<host>[:<port>]/<service>

Мы можем подключиться к сервису « my_servicename » на сервере базы данных Oracle « myoracle.db.server:1521 »:

@Test
public void givenOracleServiceName_thenCreateConnectionObject() {
String oracleJdbcUrl = "jdbc:oracle:thin:@//myoracle.db.server:1521/my_servicename";
...
try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
assertNotNull(conn);
...
}
...
}

2.3. Подключение к базе данных Oracle с помощью записей tnsnames.ora

Мы также можем включить записи tnsnames.ora в URL-адрес JDBC для подключения к базам данных Oracle:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service>)))

Давайте посмотрим, как подключиться к нашему сервису « my_servicename », используя записи из файла tnsnames.ora :

@Test
public void givenOracleTnsnames_thenCreateConnectionObject() {
String oracleJdbcUrl = "jdbc:oracle:thin:@" +
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST=myoracle.db.server)(PORT=1521))" +
"(CONNECT_DATA=(SERVICE_NAME=my_servicename)))";
...
try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
assertNotNull(conn);
...
}
...
}

3. Форматы URL-адресов JDBC для MySQL

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

Чтобы подключиться к базе данных MySQL из нашего Java-приложения, давайте сначала добавим зависимость mysql-connector-java драйвера JDBC в наш pom.xml :

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>

Далее давайте взглянем на общий формат URL-адреса подключения, поддерживаемый драйвером JDBC MySQL:

protocol//[hosts][/database][?properties]

Давайте посмотрим пример подключения к базе данных MySQL « my_database » на хосте « mysql.db.server »:

@Test
public void givenMysqlDb_thenCreateConnectionObject() {
String jdbcUrl = "jdbc:mysql://mysql.db.server:3306/my_database?useSSL=false&serverTimezone=UTC";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}

URL-адрес JDBC в приведенном выше примере выглядит просто. Он состоит из четырех строительных блоков:

  • протоколjdbc:mysql:
  • хостmysql.db.server:3306
  • база данныхmy_database
  • свойстваuseSSL=false&serverTimezone=UTC

Однако иногда мы можем столкнуться с более сложными ситуациями, такими как разные типы соединений или несколько хостов MySQL и так далее.

Далее мы более подробно рассмотрим каждый строительный блок.

3.1. Протокол

За исключением обычного протокола « jdbc:mysql: », драйвер JDBC Connector-java по- прежнему поддерживает протоколы для некоторых специальных соединений:

Когда мы говорим о балансировке нагрузки и репликации JDBC, мы можем понять, что должно быть несколько хостов MySQL.

Далее давайте проверим детали другой части URL-адреса подключения — hosts .

3.2. Хозяева

Мы видели пример URL-адреса JDBC для определения одного хоста в предыдущем разделе, например, mysql.db.server:3306.

Однако, если нам нужно обрабатывать несколько хостов, мы можем перечислить хосты в списке, разделенном запятыми: host1, host2,…,hostN .

Мы также можем заключить список хостов через запятую в квадратные скобки: [host1, host2,…,hostN] .

Давайте рассмотрим несколько примеров URL-адресов JDBC для подключения к нескольким серверам MySQL:

  • jdbc:mysql://мойхост1:3306,мойхост2:3307/имя_базы_данных
  • jdbc:mysql://[мойхост1:3306,мойхост2:3307]/имя_базы_данных
  • jdbc:mysql:loadbalance://myhost1:3306,myhost2:3307/db_name?user=dbUser&password=1234567&loadBalanceConnectionGroup=group_name&ha.enableJMX=true

Если мы внимательно посмотрим на последний пример выше, мы увидим, что после имени базы данных есть некоторые определения свойств и учетных данных пользователя. Мы рассмотрим их далее.

3.3. Свойства и учетные данные пользователя

Действительные глобальные свойства будут применены ко всем хостам. Свойствам предшествует вопросительный знак « ? » и записывается в виде пар ключ=значение , разделенных `` символом « & » :

jdbc:mysql://myhost1:3306/db_name?prop1=value1&prop2=value2

Мы также можем поместить учетные данные пользователя в список свойств :

jdbc:mysql://myhost1:3306/db_name?user=root&password=mypass

Кроме того, мы можем добавить к каждому хосту префикс учетных данных пользователя в формате « пользователь: пароль@хост » :

jdbc:mysql://root:mypass@myhost1:3306/db_name

Кроме того, если наш URL-адрес JDBC содержит список хостов и все хосты используют одни и те же учетные данные пользователя, мы можем добавить префикс к списку хостов :

jdbc:mysql://root:mypass[myhost1:3306,myhost2:3307]/db_name

В конце концов, также возможно предоставить учетные данные пользователя вне URL-адреса JDBC .

Мы можем передать имя пользователя и пароль методу DriverManager.getConnection(String url, String user, String password) при вызове метода для получения соединения.

4. Формат URL JDBC для Microsoft SQL Server

Microsoft SQL Server — еще одна популярная система баз данных. Чтобы подключить базу данных MS SQL Server из приложения Java, нам нужно добавить зависимость mssql-jdbc в наш pom.xml :

<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.1.jre11</version>
</dependency>

Далее давайте рассмотрим, как создать URL-адрес JDBC для получения подключения к MS SQL Server.

Общий формат URL-адреса JDBC для подключения к базе данных MS SQL Server:

jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

Рассмотрим подробнее каждую часть формата.

  • serverName — адрес сервера, к которому мы будем подключаться; это может быть доменное имя или IP-адрес, указывающий на сервер
  • instanceName — экземпляр для подключения на serverName ; это необязательное поле, и экземпляр по умолчанию будет выбран, если поле не указано
  • portNumber — это порт для подключения к serverName (порт по умолчанию — 1433 ) .
  • properties — может содержать одно или несколько необязательных свойств подключения, которые должны быть разделены точкой с запятой, а повторяющиеся имена свойств не допускаются.

Теперь предположим, что у нас есть база данных MS SQL Server, работающая на хосте « mssql.db.server », имя экземпляра на сервере — « mssql_instance », а имя базы данных, которую мы хотим подключить, — « my_database ».

Попробуем получить подключение к этой базе данных:

@Test
public void givenMssqlDb_thenCreateConnectionObject() {
String jdbcUrl = "jdbc:sqlserver://mssql.db.server\\mssql_instance;databaseName=my_database";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}

5. Формат URL JDBC для PostgreSQL

PostgreSQL — популярная система баз данных с открытым исходным кодом. Для работы с PostgreSQL драйвер JDBC postgresql должен быть добавлен как зависимость в наш pom.xml :

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>

Общая форма URL-адреса JDBC для подключения к PostgreSQL:

jdbc:postgresql://host:port/database?properties

Теперь давайте рассмотрим каждую часть приведенного выше формата URL-адреса JDBC.

Параметр host — это доменное имя или IP-адрес сервера базы данных.

Если мы хотим указать адрес IPv6, параметр host должен быть заключен в квадратные скобки, например, jdbc:postgresql://[::1]:5740/my_database .mysql

Параметр port указывает номер порта, который прослушивает PostgreSQL. Параметр порта является необязательным, а номер порта по умолчанию — 5432 .

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

Параметр properties может содержать группу пар ключ=значение , разделенных символом « & ».

Разобравшись с параметрами в формате URL-адреса JDBC, давайте посмотрим на пример того, как получить подключение к базе данных PostgreSQL:

@Test
public void givenPostgreSqlDb_thenCreateConnectionObject() {
String jdbcUrl = "jdbc:postgresql://postgresql.db.server:5430/my_database?ssl=true&loglevel=2";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}

В приведенном выше примере мы подключаемся к базе данных PostgreSQL с помощью:

  • хост:порт – postgresql.db.server:5430
  • база данныхmy_database
  • свойства – ssl=true&loglevel=2

6. Заключение

В этой статье обсуждались форматы URL-адресов JDBC четырех широко используемых систем баз данных: Oracle, MySQL, Microsoft SQL Server и PostgreSQL.

Мы также видели различные примеры построения строки URL-адреса JDBC для получения соединений с этими базами данных.

Как всегда, полный исходный код статьи доступен на GitHub .