2009-10-29 12 views
9

Ci stiamo connettendo a Oracle dal nostro codice con una semplice classe di connettori JDBC (personalizzata). Questa classe legge le proprietà di connessione da un file di risorse e tenta di stabilire una connessione con Oracle (connessione thin).Qual è l'URL JDBC corretto per connettersi a un database RAC

Tuttavia, recentemente il database si è spostato su un RAC e ora l'applicazione non è in grado di connettersi al DB.

Ecco l'output 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) 

Quale sarebbe l'URL corretto per specificare in questo caso?

risposta

16

L'URL dovrebbe essere simile alla seguente:

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))) 

In realtà, basta copiare il tnsentries dal tnsnames.ora.

+0

Quello. È. Eccezionale. Non avevo idea che tu possa copiare direttamente da 'tnsnames.ora'. Ho appena superato una stringa di connessione JDBC prima. Il tuo post mi ha davvero aiutato. – kevinarpe

1

Si consiglia di guardare i driver OCI. Credo che dovrebbero essere più performanti e gestire meglio il RAC.

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

OCI offre vantaggi significativi rispetto ad altri metodi di accesso a un database Oracle:

controllo
  • più a grana fine su tutti gli aspetti della progettazione di applicazioni.
  • Alto grado di controllo sull'esecuzione del programma.
  • Utilizzo di tecniche di programmazione 3GL familiari e strumenti di sviluppo applicazioni quali browser e debugger.
  • Supporto di SQL dinamico, metodo 4.
  • Disponibilità sulla più ampia gamma di piattaforme di tutte le interfacce programmatiche Oracle.
  • Associazione dinamica e definizione mediante callback.
  • Descrivere le funzionalità per esporre i livelli dei metadati del server.
  • Notifica di eventi asincroni per applicazioni client registrate.
  • Capacità avanzata di manipolazione dei dati di array (DML) per array INSERT, UPDATE e DELETE.
  • Possibilità di associare una richiesta di commit con un esecuzione per ridurre i viaggi di andata e ritorno.
  • Ottimizzazione per query che utilizzano buffer di prefetch trasparenti per ridurre i round trip.
  • Sicurezza thread in modo da non dover utilizzare blocchi esclusivi reciproci (mutex) su maniglie OCI.
  • La connessione al server in modalità non bloccante significa che il controllo ritorna al codice OCI quando una chiamata è ancora in esecuzione o non può essere completata.
+0

Concordato - ma la politica aziendale (sospiro) consiglia l'uso di thin client sulle controparti "spesse". – Vini

+1

Wow ... è solo ignorante. –

2

Il punto di un file tnsnames, il più vecchio server Oracle Names, e il, consigliato metodo di server di directory LDAP più recente di risoluzione dei nomi dei database è quello di evitare di dover codificare i nomi degli host, indirizzi, porti, ecc nella vostra stringa di connessione. Gli amministratori di database dovrebbero essere in grado di spostare il database su un nuovo host o porta senza interrompere nulla.

Il modo migliore per impostare l'URL di connessione sottile è con la seguente sintassi:

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

Quindi nel tuo caso, se "OID" erano il nome DNS risolvibile del server OID presso la vostra azienda , ed è utilizzata la porta 5000, sarebbe:

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

Se i vostri amministratori di database non hanno ancora istituito OID, sono tristemente dietro. È tempo di ottenere nuovi DBA.

-squish

0

inoltre è possibile utilizzare ip scansione in Oracle 11g R2 al posto del tuo nodi 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

io non sono sicuro se a risolvere il problema, ma ho affrontato lo stesso problema e questa soluzione funziona per me:

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

Grazie Francisco. Ho ottenuto la soluzione (vedi risposta accettata). Ad ogni modo, apprezzo che tu abbia preso tempo per dare una mano. – Vini

0

questo è quello che ho usato:

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 
Problemi correlati