2009-10-29 21 views
9

Nos estamos conectando a Oracle desde nuestro código con una clase de conector JDBC simple (personalizada). Esta clase lee las propiedades de conexión de un archivo de recursos e intenta establecer una conexión con Oracle (conexión delgada).Cuál es la URL correcta de JDBC para conectarse a una base de datos de RAC

Sin embargo, recientemente la base de datos se ha movido a un RAC y ahora la aplicación no puede conectarse a la base de datos.

Aquí está la salida TNSPING:

Used LDAP adapter to resolve the alias 
Attempting to contact (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db1.myco.com)(PORT=1604)) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db2.myco.com)(PORT=1604)))(CONNECT_DATA=  
SERVICE_NAME=mydb1.myco.com)(SERVER=DEDICATED))) 
OK (80 msec) 

¿Cuál sería la URL correcta de especificar en este caso?

Respuesta

16

La URL debe tener el siguiente aspecto:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db1.myco.com)(PORT=1604)) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db2.myco.com)(PORT=1604))) 
(CONNECT_DATA=(SERVICE_NAME=mydb1.myco.com)(SERVER=DEDICATED))) 

En realidad, sólo tienes que copiar los tnsentries de su tnsnames.ora.

+0

Eso. Es. Increíble. No tenía idea de que puedes copiar directamente de 'tnsnames.ora'. Acabo de vadear a través de un hilo de conexión JDBC antes. Tu publicación realmente ayudó. – kevinarpe

1

Es posible que desee ver los controladores OCI. Creo que se supone que tienen un mejor desempeño y manejan mejor el RAC.

de http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg01dev.htm#429762

OCI proporciona ventajas significativas sobre otros métodos de acceso a una base de datos Oracle:

de control
  • Más de grano fino sobre todos los aspectos del diseño de la aplicación.
  • Alto grado de control sobre la ejecución del programa.
  • Uso de técnicas familiares de programación 3GL y herramientas de desarrollo de aplicaciones, como navegadores y depuradores.
  • Soporte de SQL dinámico, método 4.
  • Disponibilidad en el rango más amplio de plataformas de todas las interfaces programáticas de Oracle.
  • Enlace dinámico y definir el uso de devoluciones de llamada.
  • Describir la funcionalidad para exponer capas de metadatos del servidor.
  • Notificación de evento asíncrono para aplicaciones cliente registradas.
  • Capacidad mejorada del lenguaje de manipulación de matrices (DML) para INSERT, UPDATE y DELETE.
  • Posibilidad de asociar una solicitud de confirmación con una ejecución para reducir los viajes de ida y vuelta.
  • Optimización de consultas utilizando memorias intermedias de captación previa transparentes para reducir los viajes redondos.
  • Seguridad de subprocesos para que no tenga que usar bloqueos mutuos exclusivos (mutex) en los identificadores OCI.
  • La conexión del servidor en modo no bloqueado significa que el control vuelve al código OCI cuando una llamada todavía se está ejecutando o no se pudo completar.
+0

De acuerdo, pero la política de la empresa (suspiro) recomienda utilizar clientes delgados sobre sus contrapartes 'gruesas'. – Vini

+1

Guau ... eso es simplemente ignorante. –

2

El punto de un archivo tnsnames, el servidor de Oracle Names mayor, y el método más nuevo, recomendado LDAP servidor de directorio de resolver nombres de bases de datos es evitar tener que codificar los nombres de host, direcciones, puertos, etc. en su Cadena de conexión. Los DBA deben poder mover la base de datos a un nuevo host o puerto sin romper nada.

La mejor manera de configurar su dirección URL de conexión delgada es con la siguiente sintaxis:

jdbc:oracle:thin:@ldap://<OID server name>:<OID port>/<DB SID or Service Name>,cn=OracleContext,dc=<yourdomain>

Así, en su caso, si "oid" eran el nombre DNS resoluble del servidor OID en su empresa , y se utiliza el puerto 5000, sería:

jdbc:oracle:thin:@ldap://oid:5000/mydb1,cn=OracleContext,dc=myco,dc=com

Si los administradores de bases aún no se han establecido OID, que son lamentablemente atrás. Es hora de obtener nuevos DBA.

-squish

0

también se puede utilizar IP exploración en Oracle 11g R2 en lugar de su nodos IP:

testi=(DESCRIPTION = 
(ADDRESS_LIST= 
(ADDRESS= (PROTOCOL = TCP)(HOST = scan-ip-or-name)(PORT = 1521)) 
(FAILOVER = on) 
(LOAD_BALANCE = on) 
) 
(CONNECT_DATA= 
(SERVICE_NAME = testi) 
)) 
0

No estoy seguro de si se soluciona el problema, pero se enfrentan al mismo problema y esta solución funciona para mí:

jdbc:oracle:oci:@(DESCRIPTION=(FAILOVER=on)(ADDRESS=(PROTOCOL=TCP)(HOST=**mi.host**)(PORT=**1521**))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=**serviceName**))) 
+0

Gracias Francisco. Obtuve la solución (ver respuesta aceptada). De todos modos, te agradezco que te tomes el tiempo para echar una mano. – Vini

0

esto es lo que solía:

jdbc:oracle:thin:@ldap://xxx:389/yyy,cn=OracleContext,dc=zzz,dc=com 
ldap://xxx:389/yyy,cn=OracleContext,dc=zzz,dc=com 
ldap://xxx:389/yyy,cn=OracleContext,dc=zzz,dc=com 
Cuestiones relacionadas