Как подключится к БД Oracle используя имя сервиса (service name) вместо SID?
Есть Java приложение, которое подключается к БД используя имя хоста, порт и SID. Вот так:
jdbc:oracle:thin:@oracle.dbhost1.mydomain.ca:1521:XYZ
Где XYZ это SID.
Теперь, надо подлключиться к другой БД не используя SID, а вместо него, с именем сервиса (service name).
Попробовал, но оно так не работает:
jdbc:oracle:thin:@oracle.dbhost2.mydomain.ca:1522:ABC
ABC - имя сервиса другой БД.
Что я делаю не так?
Свободный перевод вопроса Java JDBC - How to connect to Oracle using Service Name instead of SID от @Jim Tough
Ответы (2 шт):
Как указанно в следующей подглаве официальной документации:
8.2.4 Thin-style Service Name Syntax
Thin-style service names are supported only by the JDBC Thin driver. The syntax is:
@//host_name:port_number/service_nameFor example:
jdbc:oracle:thin:HR/hr@//localhost:5221/orcl
Поэтому, попробуйте так:
jdbc:oracle:thin:@//oracle.dbhost2.mydomain.ca:1522/ABCD
Однако, если надо указать другие специфичные характеристики соединения, то лучше воспользоваться TNSNAMES стилем, то есть форматом принятым для tnsnames.ora файла (см. Oracle Net connection descriptor). Например, для распределённого соединения:
jdbc:oracle:thin:@(description=(
address=(host=oracle.dbhost2.mydomain.ca)(protocol=tcp)(port=1522))(
connect_data=(service_name=ABCD)(server=SHARED)
))
PS (прим. авт.) Синтаксис с указанием SID больше не документирован и не рекомендуется к применению.
Использовались следующие ответы: 1 ответ @Bert F, 2 ответ @Jim Tough.
Вот рабочий пример подключючения к БД Oracle:
static void open() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
co = DriverManager.getConnection("jdbc:oracle:thin:@db.example.com:1521/orcl",
"login", "password");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}