Java JDBC - jak połączyć się z Oracle za pomocą nazwy usługi zamiast SID

251

Mam aplikację Java, która korzysta z JDBC (przez JPA), która łączyła się z bazą danych programowania przy użyciu nazwy hosta, portu i identyfikatora SID Oracle:

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

XYZ był Oracle SID. Teraz muszę połączyć się z inną bazą danych Oracle, która nie używa identyfikatora SID, ale zamiast tego używa nazwy usługi Oracle.

Próbowałem tego, ale to nie działa:

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

ABCD to nazwa usługi drugiej bazy danych.

Co ja robię źle?

Jim Tough
źródło

Odpowiedzi:

427

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

Cienka styl Składnia nazwy usługi

Nazwy usług cienkich stylów są obsługiwane tylko przez cienki sterownik JDBC. Składnia jest następująca:

@ // nazwa_hosta: numer_portu / nazwa_usługi

Na przykład:

jdbc: oracle: thin: scott / tiger @ // myhost: 1521 / myservicename

Więc spróbowałbym:

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

Ponadto, zgodnie z odpowiedzią Roberta Greathouse'a, możesz również podać nazwę TNS w adresie URL JDBC, jak poniżej:

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.
źródło
Czy potrafisz uwzględnić punkt dotyczący formatu TNSNAMES w odpowiedzi na odpowiedź od @Robert Greathouse, aby osiągnąć perfekcję odpowiedzi?
Alister Lee,
Dla mnie to nie działało z @, musiałem użyć jdbc: oracle: thin: // myhost: 1521 / myservicename, ale też nie podałem danych logowania użytkownika
Daniel
Próbowałem dowiedzieć się, jak połączyć się z Oracle za pomocą cienkiego sterownika JDBC w Google App Script i wypróbowałem szereg składni bez powodzenia. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMElub jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAMEz nazwą użytkownika i hasłem jako argumentami jdbc.getConnection(). Nadal zastanawiam się.
Benjamin
92

Są więc dwa proste sposoby, aby to zadziałało. Rozwiązanie opublikowane przez Berta F działa dobrze, jeśli nie trzeba dostarczać żadnych innych specjalnych właściwości połączenia specyficznych dla Oracle. Format tego jest następujący:

jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME

Jeśli jednak musisz podać inne właściwości połączenia specyficzne dla Oracle, musisz użyć długiego stylu TNSNAMES. Musiałem to zrobić niedawno, aby umożliwić współdzielone połączenia Oracle (gdzie serwer wykonuje własną pulę połączeń). Format TNS to:

jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))

Jeśli znasz format pliku Oracle TNSNAMES, powinien on wyglądać znajomo. Jeśli nie, skorzystaj z Google, aby uzyskać szczegółowe informacje.

Jim Tough
źródło
24

Możesz również podać nazwę TNS w adresie URL JDBC, jak poniżej

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)))
Robert Greathouse
źródło
17

Spróbuj tego: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

Edycja: poniżej komentarza jest to poprawne: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(zwróć uwagę na //)

Oto link do pomocnego artykułu

DwB
źródło
3
To nie działało dla mnie, musiałem użyć jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB
Więc można użyć adresu IP zamiast oracle.hostserver2.mydomain.ca?
Benjamin
8

Ta dyskusja pomogła mi rozwiązać problem, z którym zmagałem się od wielu dni. Rozejrzałem się po Internecie, dopóki nie znalazłem odpowiedzi Jima Tougha 18 maja o godz. 15:17. Dzięki tej odpowiedzi mogłem się połączyć. Teraz chcę oddać i pomóc innym z pełnym przykładem. Tutaj idzie:

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);
        }       
    }
}
Ed Chipeta
źródło
1

Jeśli używasz Eclipse do łączenia Oracle bez SID. Do wyboru są dwa sterowniki, tj. Cienki sterownik Oracle, a drugi to inny sterownik. Wybierz inne sterowniki i wprowadź nazwę usługi w kolumnie bazy danych. Teraz możesz połączyć się bezpośrednio przy użyciu nazwy usługi bez identyfikatora SID.

Bhagavathy Vinoth
źródło
Co ważniejsze, pozwala to w pełni określić adres URL połączenia, w przeciwieństwie do cienkiego sterownika. Zabawne jest to, że nadal musisz użyć adresu URL cienkiego sterownika, aby go uruchomić (nazwy usług cienkiego stylu obsługiwane tylko przez cienki sterownik JDBC). Wiele przykładów zamieszczonych tutaj.
Edi Bice,
0

Gdy używałem dagzamiast thin, poniższa składnia wskazująca nazwę usługi działała dla mnie. Powyższe jdbc:thinrozwiązania nie działały.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Syk Nar
źródło
1
Zastanów się nad dodaniem do odpowiedzi dodatkowych informacji opisujących nieco więcej na temat tego, co działało / nie działało - co zaobserwowałeś lub wiesz, dlaczego to działa?
AJD
1
Warto zauważyć, że - używasz konkretnego sterownika. Próba użycia cienkiego sterownika Oracle zwraca: Nie znaleziono odpowiedniego sterownika dla jdbc: dag: oracle: //
access_granted
0

To powinno działać: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME

Kamesh Murali
źródło
1
Błąd: „Podano nieprawidłowy adres URL Oracle”, kombinacja 11g / ojdbc7.
access_granted