UNIX에서 작업하는 경우 가끔 OCI 드라이버가 32bit 용으로 되어 있어서 로드가 안되는 경우가 있었다. 그럴때는 UNIX에 맞는 64비트용 OCI 드라이버가 로드 되도록 환경을 수정하면 된다.

시스템에서 라이브러리가 로드되는지는 아래 코드를 이용해 확인한다.
try
{
  System.loadLibrary("ocijdbc9");
}
catch(Exception e)
{
  out.println("loadLibrary Error");
  out.println(e.getMessage());
  System.exit(-1);
}

--------------------------------------------------------------------------------
OCI 관련 참고 자료 [자바서비스넷 에서 퍼옮]

Oracle OCI Driver와 Thin Driver  

Sun에서는 각 Vender들(Oracle, informix, sybase,etc..)에게 4가지 종류의
JDBC Driver가 있음을 공표 했습니다.
그 중에서도 Type 2와 Type 4형태의 Driver를 Vender들이 많이들 제공하는데,
Type 2 JDBC Driver란, Oracle로 얘기하면 Sql*Net을 필요로 하며, .dll혹은
.so형태의 H/W 종속적인 형태의 Native Module을 통해 DB와 연결됩니다.
Oracle의 경우 JDBC Type 2 형태를 통상 OCI(Oracle Call Interface) Driver라
부릅니다.


반면 Type 4 형태의 JDBC Driver는 순수하게 Java package만으로 바로 DB와
연결이 가능합니다. Oracle에서는 통상 thin Driver가 부릅니다.

Type 2형태가 보다 빠른 성능을 냅니다. 반면, SQL*Net(Oracle의 경우) 과 같은
native module이 항상 있어야 하므로 물리적인 H/W구성에 다소 종속적인 형태가
될 수 밖에 없습니다.

반면 Type 4의 형태일 경우는 Client에서 필요로 하는 것은 유일하게 Java클래스
들만으로 DB와 접속이 가능하니 어떤 H/W, OS에서도 유연하게 DB연결이 가능
합니다. 대신 OCI 형태보다 성능이 떨어진다고 합니다.

그러나 이건 어디까지나 Oracle JDBC Driver에 한해서 그러할 뿐, 다른 DB
Vendor는 특정 Type의 JDBC Driver만 제공하기도 합니다.


Oracle의 경우, OCI Driver와 thin Driver를 사용하는 방법은 다음과 같습니다.

OCI Driver:
     libjdbc*.so 파일이 필요하며, 해당 디렉토리가 Shared Library Path에 등록되어
     있어야 합니다. 즉, 최소한 Oracle Client 제품이 머신에 설치되어 있어야 합니다.
     자세한 사항은 다음의 문서를 참조하세요.
     http://javaservice.net/~java/bbs/read.cgi?m=dbms&b=jdbc&c=r_p&n=956117778

     classes111.zip 이 필요합니다.

   [사용법]
     String driver = "oracle.jdbc.driver.OracleDriver";
     String url = "jdbc:oracle:oci8:@ORA8i_alias";
     String user = "scott";  String password = "tiger";
     Class.forName(dirver);
     Java.sql.Connection conn = DriverManager.getConnection(url, user, password);

    NOTE: $ORACLE_HOME/network/admin/tnsnames.ora 파일에 해당 alias가 등록되어
          있어야 합니다.

Thin Driver:
     classes111.zip 이 필요합니다. thin 방식의 경우는 이 파일만 있으면 되며, Oracle관련
     제품이 Local머신에 설치되어 있을 필요가 없습니다.


   [사용법]
     String driver = "oracle.jdbc.driver.OracleDriver";
     String url = "jdbc:oracle:thin:@210.220.251.96:1521:ORA8i";
     String user = "scott";  String password = "tiger";
     Class.forName(dirver);
     Java.sql.Connection conn = DriverManager.getConnection(url, user, password);
  
   NOTE: thin 방식으로 접속할 경우, 원격지 Oracle DB의" Listener"가 떠 있어야 합니다.
         본게시판의 JDBC FAQ 를 참조하세요

   
NOTE: 프로그램 소스상의 유일한 차이점은 DB URL이 OCI는 Remote DB에 대한 Local Alias를
    사용하는 반면, Thin Driver는 Remote 머신의 IP Address와 Port번호, 그리고
    해당 DB의 SID를 필요로 한다는 것만이 차이가 있을 뿐입니다.

-------------------------------------------------------  
  본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다
================================================
  자바서비스넷 이원영
  E-mail: javaservice@hanmail.net
  PCS:019-310-7324
================================================

각 시스템별 Shared Library PATH 환경변수는 아래와 같습니다.

AIX            LD_LIBRARY_PATH
OS/2           LIBPATH
Windows NT/95  PATH
Solaris        LD_LIBRARY_PATH
Linux          LD_LIBRARY_PATH
HP/UX          SHLIB_PATH


OCI 드라이버는 해당 OS의 shared library를 통해 native module을 사용합니다.
$ORACLE_HOME/lib 디렉토리에 보시면 Oracle 8.0.5의 경우 liboci804jdbc.so
(혹은 *.sl)파일이 있을 겁니다. 이것이 shared library이지요.
Oracle 8.1.5의 경우는 libocijdbc8.so 파일입니다.

결국, '손님'은 이 환경변수가 제대로 잡혀 있지 않아서 발생하는 문제입니다.

LD_LIBRARY_PATH=/usr/lib:/home/oracle/app/oracle/product/815/lib:/usr/java/lib
export LD_LIBRARY_PATH

Linux 에서 Oracle 8.1.5 버전을 사용하는 저의 LD_LIBRARY_PATH를 참고 하세요.

javaservice:/home/java$ uname -a
Linux javaservice.net 2.2.12-20kr #1 Tue Oct 12 16:46:36 KST 1999 i686 unknown
javaservice:/home/java$ env|grep LD_LIB
LD_LIBRARY_PATH=/usr/lib:/home/oracle/app/oracle/product/815/lib:/usr/java/lib
javaservice:/home/java$ env|grep CLASS
CLASSPATH=.:/usr/java/lib/classes.zip:/home/oracle/app/oracle/product/815/\
jdbc/lib/classes111.zip:/home/oracle/app/oracle/product/815/jdbc/lib/\
nls_charset11.zip
javaservice:/home/java$


NOTE: 서블렛 엔진마다 LD_LIBRARY_PATH를 거는 방법이 약간씩 다른긴 합니다만,
      최근엔 대부분, 서블렛엔진을 띄우기 전에 LD_LIBRARY_PATH를 환경변수에
      잡아주거나, Start 시키는 Script 에 첨가해 두는 것이 일반적인 듯 합니다.

Posted by Gu Youn
,