Java JDBC - Як підключитися до Oracle за допомогою Імені служби замість SID


251

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

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

XYZ був SID Oracle. Тепер мені потрібно підключитися до іншої бази даних Oracle, яка не використовує SID, але використовує натомість Oracle "Ім'я служби".

Я спробував це, але це не працює:

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

ABCD - ім'я служби іншої бази даних.

Що я роблю неправильно?

Відповіді:


427

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

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

Імена послуг у тонкому стилі підтримуються лише драйвером JDBC Thin. Синтаксис:

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

Чи можете ви включити пункт про формат 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(зверніть увагу на //)

Ось посилання на корисну статтю


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 для підключення Oracle без 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.