Java JDBC - Как подключиться к Oracle, используя имя службы вместо SID - PullRequest
229 голосов
/ 28 января 2011

У меня есть приложение 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 - это имя службы другой базы данных.

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

Ответы [ 8 ]

398 голосов
/ 28 января 2011

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

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

Имена сервисов Thin-style поддерживаются только тонким драйвером 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)))
89 голосов
/ 18 мая 2011

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

23 голосов
/ 28 января 2011

Вы также можете указать имя 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)))
13 голосов
/ 28 января 2011

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

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

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

7 голосов
/ 09 октября 2015

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

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

0 голосов
/ 11 декабря 2018

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

0 голосов
/ 28 июля 2018

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

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