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

251

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

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

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

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

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

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

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

Джим таф
источник

Ответы:

427

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)))
Берт F
источник
Можете ли вы включить пункт о формате TNSNAMES для каждого ответа от @Robert Greathouse, чтобы достичь совершенства ответа?
Алистер Ли
Для меня это не сработало с @, мне пришлось использовать jdbc: oracle: thin: // myhost: 1521 / myservicename, но я также не предоставлял учетные данные пользователя
Даниэль
Я пытался выяснить, как подключиться к Oracle, используя тонкий драйвер JDBC в Google App Script, и попробовал несколько синтаксисов без успеха. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEили jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAMEс именем пользователя и паролем в качестве аргументов jdbc.getConnection(). Все еще озадачивает.
Бенджамин
92

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

Джим таф
источник
24

Вы также можете указать имя 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)))
Роберт Грейтхаус
источник
17

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

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

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

DWB
источник
3
Это не сработало для меня, я должен был использовать jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB
Таким образом, IP можно использовать здесь вместо oracle.hostserver2.mydomain.ca?
Бенджамин
8

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

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

Бхагавати Винот
источник
Что еще более важно это позволяет вам полностью указать URL-адрес подключения в отличие от тонкого драйвера. Самое смешное, что вам все еще нужно использовать URL-адрес тонкого драйвера, чтобы заставить его работать (имена сервисов тонкого стиля поддерживаются только тонким драйвером JDBC). Множество примеров размещено здесь.
Эди Бис
0

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

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Сык Нар
источник
1
Пожалуйста, подумайте над тем, чтобы добавить в свой ответ дополнительную информацию, в которой немного подробнее рассказывается о том, что сработало / не сработало.
AJD
1
Стоит отметить, что вы используете определенный драйвер. Попытка использовать тонкий драйвер Oracle возвращает: Не найден подходящий драйвер для jdbc: dag: oracle: //
access_granted
0

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

Камеш Мурали
источник
1
Ошибка: «Указан неверный URL-адрес Oracle», комбинация 11g / ojdbc7.
access_granted