Pregunta

Tengo una aplicación Java que usa JDBC (a través de JPA) que se conectaba a una base de datos de desarrollo utilizando HostName, Port y Oracle Sid, así:

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, pero utiliza 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?

¿Fue útil?

Solución

http://download.oracle.com/docs/cd/b28359_01/java.111/b31224/urls.htm#beidhcba

Sintaxis del nombre del servicio delgado

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

@// host_name: port_number/servicio_name

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 TNS en la URL 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)))

Otros consejos

Así que hay dos formas fáciles de hacer que esto funcione. La solución publicada por Bert F funciona bien si no necesita proporcionar otras propiedades especiales de conexión de Oracle específicas. 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, entonces debe usar el estilo Long TNSNames. Tuve que hacer esto recientemente para habilitar Oracle Shared Connections (donde el servidor realiza su propia agrupación de conexión). 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 parecerle familiar. Si no, solo busque en Google para los detalles.

También puede especificar el nombre TNS en la URL 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)))

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 (nota la //)

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

Esta discusión me ayudó a resolver el problema con el que estaba luchando durante días. Miré a su alrededor por todo Internet hasta que encontré el respondido por 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);
        }       
    }
}

En caso de que esté utilizando Eclipse para conectar Oracle sin SID. Hay dos controladores para seleccionar IE, 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 con el nombre del servicio sin SID.

Cuando usas dag en vez de thin, la sintaxis a continuación apuntando al nombre del servicio funcionó para mí. los jdbc:thin Las soluciones anteriores no funcionaban.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top