Java JDBC - Cómo conectarse a Oracle utilizando el nombre del servicio en lugar del SID

Tengo una aplicación Java que utiliza JDBC (a través de JPA) que se conectaba a una base de datos de desarrollo utilizando el nombre de host, el puerto y el SID de Oracle, así:

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

XYZ era el SID de Oracle. Ahora necesito conectarme a una base de datos Oracle diferente que no utiliza un SID, pero utiliza un Oracle "Service Name" en su lugar.

He intentado esto pero no funciona:

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

ABCD es el nombre del servicio de la otra base de datos.

¿Qué estoy haciendo mal?

Solución

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

Sintaxis de nombres de servicio de estilo fino

Los nombres de servicio de estilo Thin son soportados únicamente por el controlador JDBC Thin. La sintaxis es:

@//nombre_de_host:número_de_puerto/nombre_de_servicio

Por ejemplo:

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

Así que yo probaría:

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

Además, según la respuesta de Robert Greathouse, también puede especificar el nombre del TNS en la URL JDBC como se indica a continuación:

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)))
Comentarios (2)

También puede especificar el nombre del TNS en la URL JDBC como se indica a continuación

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)))
Comentarios (0)

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

Editar: por el comentario de abajo esto es realmente correcto: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (nota el //)

Aquí hay un enlace a un artículo útil

Comentarios (1)