Java JDBC - Как подключиться к Oracle, используя имя службы вместо SID

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

jdbc:oracle:thin:@oracle.hostserver1.mydomain.ca:1521:XYZ

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

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

jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522:ABCD

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

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

Решение

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

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

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

@//host_name:port_number/service_name

Например:

jdbc:oracle:thin:scott/tiger@//myhost:1521/myservicename

Так что я бы попробовал:

jdbc:oracle:thin:@//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)

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

в

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

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

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

Если вы're с Оракулом файл tnsnames формате, то это должно быть тебе хорошо знакомо. Если нет, то просто погугли что это за детали.

Комментарии (0)

Вы также можете указать имя 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)))
Комментарии (0)

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

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

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

Комментарии (1)

Эта дискуссия помогла мне решить проблему, я боролся с в течение нескольких дней. Я посмотрел вокруг в интернете, пока не нашел ответ Джим жестко на 18 мая '11 в 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);
        }       
    }
}
Комментарии (0)

В случае, если вы используете Eclipse для подключения Oracle без Сида. Существует два драйверы для выбора, т. е., тонких драйвер Oracle и другие-это другие драйвера. Выбрать другой драйверы и введите имя в столбце базы данных. Теперь вы можете подключить непосредственно через имя сервиса без Сида.

Комментарии (1)

При использовании Даг вместо тонкий, синтаксис ниже указываю имя службы работал для меня. Выше решения `в JDBC: "тонких" не работает.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Комментарии (1)

Это должно работать: с JDBC:Oracle:на тонких//имя_хоста:порт/имя=ИМЯ_СЛУЖБЫ

Комментарии (0)