Java JDBC - Come connettersi a Oracle utilizzando Nome servizio anziché SID


251

Ho un'applicazione Java che utilizza JDBC (tramite JPA) che si stava connettendo a un database di sviluppo utilizzando nome host, porta e Oracle SID, in questo modo:

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

XYZ era Oracle SID. Ora ho bisogno di connettermi a un diverso database Oracle che non utilizza un SID, ma utilizza invece un "Nome servizio" Oracle.

Ho provato questo ma non funziona:

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

ABCD è il nome del servizio dell'altro database.

Che cosa sto facendo di sbagliato?

Risposte:


427

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

Sintassi del nome del servizio di tipo sottile

I nomi di servizi di tipo thin sono supportati solo dal driver thin JDBC. La sintassi è:

@ // nome_host: numero_porta / nome_servizio

Per esempio:

jdbc: oracle: thin: Scott / Tiger @ // myhost: 1521 / myservicename

Quindi proverei:

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

Inoltre, secondo la risposta di Robert Greathouse, puoi anche specificare il nome TNS nell'URL JDBC come di seguito:

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

Puoi incorporare il punto sul formato TNSNAMES per risposta di @Robert Greathouse per raggiungere la perfezione della risposta?
Alister Lee,

Per me non ha funzionato con @, ho dovuto usare jdbc: oracle: thin: // myhost: 1521 / myservicename, ma anche non ho fornito le credenziali dell'utente
Daniel

Ho cercato di capire come collegarmi a Oracle usando il thin driver JDBC su Google App Script e ho provato una serie di sintassi senza successo. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEoppure jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME, con nome utente e password come argomenti per jdbc.getConnection(). Ancora perplesso.
Benjamin,

92

Quindi ci sono due semplici modi per farlo funzionare. La soluzione pubblicata da Bert F funziona perfettamente se non è necessario fornire altre proprietà di connessione specifiche di Oracle. Il formato per questo è:

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

Tuttavia, se è necessario fornire altre proprietà di connessione specifiche di Oracle, è necessario utilizzare lo stile TNSNAMES lungo. Di recente ho dovuto eseguire questa operazione per abilitare le connessioni condivise Oracle (in cui il server esegue il proprio pool di connessioni). Il formato TNS è:

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

Se hai dimestichezza con il formato di file Oracle TNSNAMES, questo dovrebbe esserti familiare. In caso contrario, basta Google per i dettagli.


24

È inoltre possibile specificare il nome TNS nell'URL JDBC come di seguito

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

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

Modifica: per commento sotto questo è effettivamente corretto: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(nota il// )

Ecco un link a un articolo utile


3
Questo non ha funzionato per me, ho dovuto usare jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB,

Quindi l'IP può essere usato qui invece di oracle.hostserver2.mydomain.ca?
Benjamin,

8

Questa discussione mi ha aiutato a risolvere il problema con cui stavo lottando da giorni. Mi sono guardato intorno su Internet fino a quando ho trovato la risposta di Jim Tough il 18 maggio 11 alle 15:17. Con quella risposta sono stato in grado di connettermi. Ora voglio restituire e aiutare gli altri con un esempio completo. Ecco qui:

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

Nel caso in cui si stia utilizzando Eclipse per connettere Oracle senza SID. Ci sono due driver da selezionare, cioè Oracle thin driver e altro è un altro driver. Seleziona altri driver e inserisci il nome del servizio nella colonna del database. Ora puoi connetterti direttamente usando il nome del servizio senza SID.


Ancora più importante, ciò consente di specificare completamente l'URL di connessione a differenza del Thin Driver. La cosa divertente è che devi ancora usare l'URL del driver sottile per farlo funzionare (nomi di servizi in stile sottile supportati solo dal driver sottile JDBC). Molti esempi pubblicati qui.
Edi Bice,

0

Quando si utilizza daginvece di thin, la sintassi seguente che punta al nome del servizio ha funzionato per me. Le jdbc:thinsoluzioni sopra non hanno funzionato.

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

1
Ti preghiamo di considerare di aggiungere alla tua risposta alcune informazioni che descrivono un po 'di più su ciò che ha funzionato / non ha funzionato: cosa hai osservato o saputo sul perché questo funziona?
AJD

1
Vale la pena notare che si sta utilizzando un driver specifico. Tentativo di utilizzare i ritorni del driver thin di Oracle: Nessun driver adatto trovato per jdbc: dag: oracle: //
access_granted

0

Questo dovrebbe funzionare: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME


1
Errore: "Specificato URL Oracle non valido", combinazione 11g / ojdbc7.
access_granted
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.