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 database находится в нашем пути к классам.
Например, если ваш проект управляется Maven, нам нужно добавить ojdbc14 зависимость в ваш pom.xml :
com.oracle ojdbc14 10.2.0.4.0
Из-за некоторых проблем с лицензией Центральный репозиторий Maven указывает только на POM-файл этого артефакта. Поэтому нам нужно скачать jar и вручную установить его в наш репозиторий Maven.
Тонкий драйвер предлагает несколько видов форматов URL JDBC:
- Подключение к СКАЗАЛ
- Подключение к Oracle имя службы
- URL – адрес с |/tnsnames.ora записями
Далее мы рассмотрим каждый из этих форматов.
2.1. Подключение к базе данных Oracle SID
В некоторых более старых версиях базы данных Oracle база данных определяется как СТОРОНА. Давайте посмотрим формат URL JDBC для подключения к SID:
jdbc:oracle:thin:[/ ]@ [: ]:
Например, предположив, что у нас есть хост сервера баз данных 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:[/ ]@// [: ]/
Мы можем подключиться к сервису ” my_service name “на сервере базы данных Oracle” my oracle.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=)(PORT= ))(CONNECT_DATA=(SERVICE_NAME= )))
Давайте посмотрим, как подключиться к нашему сервису ” 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-приложения, давайте сначала добавим драйвер JDBC mysql-connector-java dependency в наш pom.xml :
mysql mysql-connector-java 8.0.22
Далее давайте посмотрим на общий формат URL-адреса подключения, поддерживаемый драйвером MySQL JDBC:
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: “протокол, коннектор-java Драйвер JDBC по-прежнему поддерживает протоколы для некоторых специальных соединений:
- Балансировка нагрузки JDBC connections – jdbc:mysql:loadbalance:
- Соединения репликации JDBC – jdbc:mysql:репликация:
Когда мы говорим о балансировке нагрузки и репликации JDBC, мы можем понять, что должно быть несколько хостов MySQL.
Далее давайте проверим детали другой части URL — адреса подключения – hosts .
3.2. Хосты
Мы видели пример URL-адреса JDBC для определения одного хоста в предыдущем разделе — например, mysql.db.server:3306.
Однако если нам нужно обработать несколько хостов, мы можем перечислить хосты в списке, разделенном запятыми: host1, host2,…,hostN .
Мы также можем заключить разделенный запятыми список хостов в квадратные скобки: [хост1, хост2,…,хостН] .
Давайте рассмотрим несколько примеров URL-адресов JDBC для подключения к нескольким серверам MySQL:
- jdbc:mysql://myhost1:3306,myhost2:3307/db_name
- jdbc:mysql://[myhost1:3306,myhost2:3307]/db_name
- 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
Кроме того, мы можем префиксировать каждый хост учетными данными пользователя в формате “ user: [email protected] “ :
jdbc:mysql://root:[email protected]: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 :
com.microsoft.sqlserver mssql-jdbc 8.4.1.jre11
Далее давайте рассмотрим, как построить URL-адрес JDBC для получения подключения к MS SQL Server.
Общий формат URL-адреса JDBC для подключения к базе данных MS SQL Server::
jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]
Давайте подробнее рассмотрим каждую часть формата.
- ServerName – адрес сервера, к которому мы подключимся; это может быть доменное имя или IP-адрес, указывающий на сервер
- InstanceName – экземпляр для подключения к on ServerName ; это необязательное поле, и экземпляр по умолчанию будет выбран, если это поле не указано
- PortNumber – это порт для подключения к on 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 :
org.postgresql postgresql 42.2.18
Общая форма URL-адреса JDBC для подключения к PostgreSQL такова:
jdbc:postgresql://host:port/database?properties
Теперь давайте рассмотрим каждую часть в приведенном выше формате URL-адреса JDBC.
Параметр host – это доменное имя или IP – адрес сервера базы данных.
Если мы хотим указать IPv6-адрес, то хозяин параметр должен быть заключен в квадратные скобки, например, jdbc:postgresql://[::1]:5740/my_database .mysql
Параметр port указывает номер порта, который прослушивает PostgreSQL. Параметр port является необязательным, а номер порта по умолчанию – 5432 .
Как следует из его названия, параметр database определяет имя базы данных, к которой мы хотим подключиться.
Параметр properties может содержать группу пар key=value , разделенных символом” & “.
После понимания параметров в формате 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 .