Java JDBC - Cómo conectarse a Oracle usando el Nombre del servicio en lugar del SID

251

Tengo una aplicación Java que usa JDBC (a través de JPA) que se conectaba a una base de datos de desarrollo usando hostname, puerto y Oracle SID, como este:

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

XYZ fue el Oracle SID. Ahora necesito conectarme a una base de datos Oracle diferente que no usa un SID, sino que usa un "Nombre de servicio" de Oracle.

Intenté 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?

Jim Tough
fuente

Respuestas:

427

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

Sintaxis de nombre de servicio de estilo fino

Los nombres de servicio de estilo delgado solo son compatibles con el controlador JDBC Thin. La sintaxis es:

@ // nombre_host: número_puerto / nombre_servicio

Por ejemplo:

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

Entonces intentarí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 de TNS en la URL de JDBC de la siguiente manera:

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
fuente
¿Puede incorporar el punto sobre el formato TNSNAMES por respuesta de @Robert Greathouse para lograr la perfección de la respuesta?
Alister Lee
Para mí no funcionó con la @, tuve que usar jdbc: oracle: thin: // myhost: 1521 / myservicename, pero tampoco proporcioné las credenciales de usuario
Daniel
He estado tratando de descubrir cómo conectarme a Oracle usando el controlador delgado JDBC en Google App Script y probé varias sintaxis sin éxito. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEo jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME, con nombre de usuario y contraseña como argumentos para jdbc.getConnection(). Aún desconcertante.
Benjamin
92

Entonces, hay dos formas fáciles de hacer que esto funcione. La solución publicada por Bert F funciona bien si no necesita suministrar ninguna otra propiedad especial de conexión específica de Oracle. El formato para eso es:

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

Sin embargo, si necesita proporcionar otras propiedades de conexión específicas de Oracle, debe usar el estilo TNSNAMES largo. Tuve que hacer esto recientemente para habilitar las conexiones compartidas de Oracle (donde el servidor hace su propia agrupación de conexiones). El formato TNS es:

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

Si está familiarizado con el formato de archivo Oracle TNSNAMES, entonces esto debería serle familiar. Si no es así, solo busca en Google los detalles.

Jim Tough
fuente
24

También puede especificar el nombre de TNS en la URL de JDBC como se muestra 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)))
Robert Greathouse
fuente
17

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

Editar: por comentario a continuación, esto es realmente correcto: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(tenga en cuenta el //)

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

DwB
fuente
3
Esto no funcionó para mí, tuve que usarlo jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB
Entonces, ¿la IP se puede usar aquí en lugar de oracle.hostserver2.mydomain.ca?
Benjamin
8

Esta discusión me ayudó a resolver el problema con el que estuve luchando durante días. Miré a mi alrededor en Internet hasta que encontré la respuesta de Jim Tough el 18 de mayo del 11 a las 15:17. Con esa respuesta pude conectarme. Ahora quiero retribuir y ayudar a otros con un ejemplo completo. Aquí va:

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
fuente
1

En caso de que esté utilizando eclipse para conectar Oracle sin SID. Hay dos controladores para seleccionar, es decir, Oracle thin driver y otro es otro controlador. Seleccione otros controladores e ingrese el nombre del servicio en la columna de la base de datos. Ahora puede conectarse directamente usando el nombre del servicio sin SID.

Bhagavathy Vinoth
fuente
Más importante aún, esto le permite especificar completamente la URL de conexión a diferencia del Thin Driver. Lo curioso es que aún tiene que usar la URL del controlador delgado para que funcione (los nombres de servicio de estilo delgado solo son compatibles con el controlador delgado JDBC). Muchos ejemplos publicados aquí.
Edi Bice
0

Cuando se usa en daglugar de thin, la sintaxis a continuación que apunta al nombre del servicio funcionó para mí. Las jdbc:thinsoluciones anteriores no funcionaron.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Syk Nar
fuente
1
Considere agregar más información a su respuesta que describa un poco más sobre lo que funcionó / ​​no funcionó: ¿qué observó o sabía sobre por qué funciona?
AJD
1
Vale la pena señalar que está utilizando un controlador específico. Intentar utilizar el controlador delgado de Oracle devuelve: No se encontró un controlador adecuado para jdbc: dag: oracle: //
access_granted
0

Esto debería estar funcionando: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME

Kamesh Murali
fuente
1
Error: "URL de Oracle no válida especificada", combinación 11g / ojdbc7.
access_granted