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

217

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

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

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

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

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

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

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

Теги:
jdbc
connection-string

8 ответов

366
Лучший ответ

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)))
  • 7
    +1 за ссылку.
  • 7
    +1 за обращение к руководству
Показать ещё 3 комментария
78

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

  • 0
    Спасибо большое! Это было очень полезно :)
  • 1
    не знал об изменении формата TNS, спасибо
Показать ещё 1 комментарий
21

Вы также можете указать имя 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
    Это хорошо сработало для меня.
  • 0
    Это очень важная часть полного ответа на этот вопрос. Спасибо!
12

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

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

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

  • 2
    Это не сработало для меня, мне пришлось использовать jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD .
6

Это обсуждение помогло мне решить проблему, с которой я боролся в течение нескольких дней. Я огляделся по всему Интернету, пока не нашел ответ от Джима Тхафа 18 мая в 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 для подключения oracle без SID. Есть два драйвера для выбора, т.е. Драйвер Oracle thin, а другой - другой драйвер. Выберите другие драйверы и введите имя службы в столбце базы данных. Теперь вы можете напрямую подключиться, используя имя службы без SID.

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

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

0

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

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
  • 1
    Пожалуйста, подумайте о том, чтобы добавить в свой ответ дополнительную информацию, в которой немного подробнее рассказывается о том, что сработало / не сработало - что вы наблюдали или знали о том, почему это работает?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню