Как подключится к БД 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 шт):

Автор решения: 0xdb

Как указанно в следующей подглаве официальной документации:

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_name

For 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.

→ Ссылка
Автор решения: mrprogre

Вот рабочий пример подключючения к БД 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());
    }
}

→ Ссылка