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:
- Подключение к SID
- Подключение к имени службы Oracle
- URL-адрес с записями
tnsnames.ora
``
Далее мы рассмотрим каждый из этих форматов.
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 с балансировкой нагрузки —
jdbc:mysql:loadbalance:
- Соединения репликации JDBC –
jdbc:mysql:replication:
Когда мы говорим о балансировке нагрузки и репликации 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 .