Připojení na Oracle RAC přes JDBC
Zkumal jsem možnosti, jak se připojit na Oracle RAC přes JDBC. Pro vyzkoušení jsem si vzal jednoduchou utilitku jisql, která dělá přesně, co jsem potřeboval – je to commandline SQL konzole přes JDBC. Pro test jsem použil ojdbc14.jar z Oracle Clienta 10.2 (tzv. thin client). Příkaz pro připojení uživatele user na RAC xxbig1, xxbig2 a xxbig3 ke službě serviceid je následující:
java -classpath lib/jisql.jar:lib/ojdbc14.jar com.xigole.util.sql.Jisql -user user -password pass -driver oracle.jdbc.OracleDriver -cstring 'jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=xxbig1)(PORT=1523)) (ADDRESS=(PROTOCOL=TCP)(HOST=xxbig2)(PORT=1523)) (ADDRESS=(PROTOCOL=TCP)(HOST=xxbig3)(PORT=1523))) (CONNECT_DATA=(SERVICE_NAME=serviceid) (FAILOVER_MODE= (TYPE=SELECT) (METHOD=BASIC) (RETRIES=20) (DELAY=15))))'
Trošku jsem se napálil, když jsem použil IP adresy. Ovladač se jednou připojil, podruhé zase ne. Bylo to dosti nedeterministické. Nakonec jsem zjistil, že ačkoli se připojím na listener pomocí IP adresy, ten pak vrací klientovi hostname (xxbigX). Pokud jej nezná (na daném serveru není funční DNS), tak se Oracle chová tak, jak se chová. Řešením bylo přidat záznamy do /etc/hosts pro všechny tři xxbigX stroje.
Přímé připojení bez RAC by pak bylo (uvedu už jen JDBC connection string):
jdbc:oracle:thin:xxbig1:1523/serviceid
Ukázka práce s utilitou jisql:
Enter a query: 1 > SELECT TABLE_NAME FROM TABS; ... 2 > CREATE TABLE TEST (I INT, S CHAR(10) ); ... 3 > DROP TABLE TEST;