JDBC Java: come connettersi a Oracle utilizzando Nome servizio anziché SID

Ho un’applicazione Java che utilizza JDBC (tramite JPA) che si stava connettendo a un database di sviluppo usando hostname, port e Oracle SID, come questo:

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

XYZ era il SID Oracle. Ora ho bisogno di connettermi a un diverso database Oracle che non utilizza un SID, ma utilizza 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?

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

Sintassi del nome del servizio stile thin

I nomi di servizio in stile sottile sono supportati solo dal driver JDBC Thin. La syntax è:

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

Quindi ci sono due semplici modi per farlo funzionare. La soluzione pubblicata da Bert F funziona correttamente se non è necessario fornire altre proprietà di connessione specifiche per 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. Ho dovuto farlo di recente per abilitare le connessioni condivise di Oracle (dove il server fa il proprio pooling 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 familiarità con il formato di file Oracle TNSNAMES, questo dovrebbe sembrarti familiare. Se non poi basta Google per i dettagli.

È inoltre ansible specificare il nome TNS nell’URL JDBC come indicato 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))) 

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

Modifica: per commento qui sotto è corretto: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (notare // )

Ecco un link a un articolo utile

Questa discussione mi ha aiutato a risolvere il problema con cui stavo lottando da giorni. Mi sono guardato intorno a Internet finché non ho trovato la risposta di Jim Tough il 18 maggio alle 15:17. Con quella risposta ero 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); } } } 

Nel caso in cui si utilizzi eclipse per connettere oracle senza SID. Ci sono due driver da selezionare, ad esempio, il driver sottile Oracle 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.

Quando si usa dag invece di thin , la syntax che segue il nome del servizio ha funzionato per me. jdbc:thin soluzioni jdbc:thin sopra non funzionavano.

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