2011-01-28 28 views
183

Tengo una aplicación Java que utiliza JDBC (a través de la APP) que se conecta a una base de datos de desarrollo utilizando el nombre de host, el puerto y SID de Oracle, así:Java JDBC - Cómo conectarse a Oracle utilizando el nombre de servicio en lugar de SID

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

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

He intentado esto, pero no funciona:

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?

Respuesta

324

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

Nombre del servicio de estilo delgado Sintaxis

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

@ // nombre_host: número_puerto/service_name

Por ejemplo:

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

Así que me gustaría probar:

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

Además, por la respuesta de Robert Greathouse, también puede especificar el nombre de TNS en la URL JDBC como 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))) 
+6

+1 como enlace de referencia. – DwB

+6

+1 para referirse al manual –

+7

+1, vengo del futuro y su solución me salvó otra hora de dolor de cabeza –

11

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

Editar: por debajo de este comentario Es en realidad correcta: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (nota de la //)

Aquí es una link a un artículo útil

+2

Esto no funcionó para mí, tuve que usar 'jdbc: oracle: thin: @ // oracle.hostserver2.mydomain.ca: 1522/ABCD'. – WynandB

20

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

Esto funcionó bien para mí. – EzAnalyst

+0

Esta es una parte muy importante de la respuesta completa a esta pregunta. ¡Gracias! –

74

Así que hay dos formas fáciles de hacerlo funcionar. La solución publicada por Bert F funciona bien si no necesita proporcionar ninguna otra propiedad especial de conexión específica de Oracle. El formato para que sea:

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

Sin embargo, si usted necesita para abastecer a otras propiedades de conexión específicas de Oracle a continuación, es necesario utilizar el estilo TNSNAMES larga.Tuve que hacer esto recientemente para habilitar las conexiones compartidas de Oracle (donde el servidor hace su propia agrupación de conexiones). El formato de 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 de Oracle TNSNAMES, entonces esto debería ser familiar para usted. Si no, solo Google para los detalles.

+0

¡Muchas gracias! Esto fue muy útil :) – Ethereal

+1

no sabía sobre la variación del formato TNS, gracias –

+0

Estimado Jim, ¿cómo puedo agregar parámetros de conexión jdbc como este "oracle.jdbc.ReadTimeout = 30000"? –

5

Esta discusión me ayudó a resolver el problema con el que estaba luchando durante días. Miré por todas partes en Internet hasta que encontré la respuesta de Jim Tough el 18 de mayo de 2011 a las 15:17. Con esa respuesta pude conectarme. Ahora quiero devolver algo 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); 
     }  
    } 
} 
1

En caso de que esté utilizando eclipse para conectar Oracle sin SID. Hay dos controladores para seleccionar, es decir, el controlador delgado de Oracle 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.

+0

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

Cuestiones relacionadas