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

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

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

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

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

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

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

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

7 ответов


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/[email protected]//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, вам нужно использовать стиль long 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

Edit: за комментарий ниже это на самом деле правильно: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. Есть два драйвера для выбора, т. е. Oracle thin driver, а другой-другой драйвер. Выберите другие драйверы и введите имя службы в столбце база данных. Теперь вы можете подключиться напрямую, используя имя службы без SID.


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

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