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

StackOverflow https://stackoverflow.com/questions/4832056

Вопрос

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

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

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

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

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

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

Что я делаю не так?

Это было полезно?

Решение

http://download.oracle.com/docs/cd/b28359_01/java.111/b31224/urls.htm#beidhcba

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

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

@// 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)))

Другие советы

Так что есть два простых способа сделать эту работу. Решение, опубликованное 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 это для деталей.

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top