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


Tengo una aplicación Java que usa JDBC (vía JPA) que se conectaba a una base de datos de desarrollo usando hostname, port y Oracle SID, así:

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

XYZ era el Oráculo SID. Ahora necesito conectarme a una base de datos de Oracle diferente que no use un SID, sino que use un "Nombre de servicio" de Oracle en su lugar.

He intentado esto pero no lo hace trabajo:

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

ABCD es el Nombre de Servicio de la otra base de datos.

¿Qué estoy haciendo mal?

Author: Jim Tough, 2011-01-28

7 answers

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

Sintaxis de Nombre de Servicio de estilo delgado

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

@ / / host_name: port_number/service_name

Por ejemplo:

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

Así que me gustaría try:

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

También, según la respuesta de Robert Greathouse, también puede especificar el nombre TNS en la URL 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)))
 356
Author: Bert F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-19 05:43:31

Así que hay dos maneras fáciles de hacer que esto funcione. La solución publicada por Bert F funciona bien si no necesita suministrar ninguna otra propiedad 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 largo TNSNAMES. 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 parecerle familiar. Si no, entonces Google para los detalles.

 81
Author: Jim Tough,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-16 12:52:43

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)))
 21
Author: Robert Greathouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-31 08:52:12

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

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

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

 12
Author: DwB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-29 08:05:56

Esta discusión me ayudó a resolver el problema con el que estuve luchando durante días. Miré alrededor por todo el Internet hasta que encontré el contestado por Jim Tough el 18 de mayo '11 en 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);
        }       
    }
}
 6
Author: Ed Chipeta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-19 11:15:48

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 introduzca el nombre del servicio en la columna base de datos. Ahora puede conectarse directamente usando el nombre del servicio sin SID.

 1
Author: Bhagavathy Vinoth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-24 12:12:23

Cuando se usa dag en lugar de thin, la sintaxis de abajo que apunta al nombre del servicio funcionó para mí. Las soluciones jdbc:thin anteriores no funcionaron.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
 0
Author: Syk Nar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-28 00:10:01