Java JDBC - Как подключиться к Oracle с использованием Service Name вместо SID

У меня есть приложение Java, которое использует JDBC (через JPA), который подключался к базе данных разработки с использованием имени хоста, порта и SID Oracle, например:

JDBC: оракул: тонкий: @oracle.hostserver1.mydomain.ca: 1521: XYZ

XYZ был SID Oracle. Теперь мне нужно подключиться к другой базе данных Oracle, которая не использует SID, но вместо этого использует "Имя службы" Oracle.

Я пробовал это, но он не работает:

JDBC: оракул: тонкий: @oracle.hostserver2.mydomain.ca: 1522: ABCD

ABCD - это имя службы другой базы данных.

Что я делаю неправильно?

Ответ 1

http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

Синтаксис имени службы в тонком стиле

Имена сервисов в тонком стиле поддерживаются только тонким драйвером JDBC. Синтаксис:

@//host_name: port_number/service_name

Например:

JDBC: оракул: тонкий: Скот/тигр @//MyHost: 1521/myservicename

Поэтому я бы попробовал:

JDBC: оракул: тонкий: @//oracle.hostserver2.mydomain.ca:1522/ABCD

Кроме того, в ответе Роберта Грейтхауса вы также можете указать имя TNS в URL JDBC, как показано ниже:

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))

Ответ 2

Таким образом, есть два простых способа сделать эту работу. Решение, опубликованное Bert F, отлично работает, если вам не нужно предоставлять какие-либо другие специфические свойства соединения Oracle. Формат для этого:

jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME

Однако, если вам нужно предоставить другие специфичные для Oracle свойства соединения, вам нужно использовать длинный стиль TNSNAMES. Мне пришлось сделать это недавно, чтобы включить общие подключения Oracle (где сервер выполняет свой пул соединений). Формат TNS:

jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))

Если вы знакомы с форматом файлов Oracle TNSNAMES, это должно показаться вам знакомым. Если нет, то просто Google это для деталей.

Ответ 3

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

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))

Ответ 4

Попробуйте это: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

Изменение: для комментария ниже это действительно правильно: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (обратите внимание на //)

Вот ссылка на полезную статью

Ответ 5

Это обсуждение помогло мне решить проблему, с которой я боролся в течение нескольких дней. Я огляделся по всему Интернету, пока не нашел ответ от Джима Тхафа 18 мая в 15:17. С этим ответом мне удалось подключиться. Теперь я хочу вернуть и помочь другим с полным примером. Здесь:

import java.sql.*; 

public class MyDBConnect {

    public static void main(String[] args) throws SQLException {

        try { 
            String dbURL = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=whatEverYourHostNameIs)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=yourServiceName)))";
            String strUserID = "yourUserId";
            String strPassword = "yourPassword";
            Connection myConnection=DriverManager.getConnection(dbURL,strUserID,strPassword);

            Statement sqlStatement = myConnection.createStatement();
            String readRecordSQL = "select * from sa_work_order where WORK_ORDER_NO = '1503090' ";  
            ResultSet myResultSet = sqlStatement.executeQuery(readRecordSQL);
            while (myResultSet.next()) {
                System.out.println("Record values: " + myResultSet.getString("WORK_ORDER_NO"));
            }
            myResultSet.close();
            myConnection.close();

        } catch (Exception e) {
            System.out.println(e);
        }       
    }
}

Ответ 6

Если вы используете eclipse для подключения oracle без SID. Есть два драйвера для выбора, т.е. Драйвер Oracle thin, а другой - другой драйвер. Выберите другие драйверы и введите имя службы в столбце базы данных. Теперь вы можете напрямую подключиться, используя имя службы без SID.

Ответ 7

Когда я использовал dag вместо thin, синтаксис ниже, указывающий на имя сервиса, работал для меня. Решения jdbc:thin выше не работали.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME

Ответ 8

Это должно работать: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME