java - example - thin url oracle
Java JDBC: cómo conectarse a Oracle utilizando el nombre del servicio en lugar de SID (7)
Tengo una aplicación Java que utiliza JDBC (a través de JPA) que se conectaba a una base de datos de desarrollo que usa el nombre de host, el puerto y el SID de Oracle, como este
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 use un SID, pero que use un "Nombre de Servicio" de Oracle en su lugar.
Intenté 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?
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 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 de Oracle TNSNAMES, esto le debe parecer familiar. Si no, entonces simplemente buscalo en Google para los detalles.
Cuando uso dag
lugar de thin
, la siguiente sintaxis que apunta al nombre del servicio funcionó para mí. Las soluciones jdbc:thin
anteriores no funcionaron.
jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
En caso de que esté utilizando eclipse para conectar oracle sin SID. Hay dos controladores para seleccionar, es decir, 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.
Esta discusión me ayudó a resolver el problema con el que estaba luchando durante días. Miré por todo 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 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);
}
}
}
Prueba esto: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD
Edición: según el comentario a continuación, esto es realmente correcto: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD
(observe la //
)
Aquí hay un link a un artículo útil
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)))
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 ligero 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
Así que 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)))