java.lang.UnsatisfiedLinkError で libocijdbc10.so がロードできない場合の対処方法

またまたサーバ構築関連の不具合の備忘録。これも Oracle のバージョンが変わるたびにハマル場所。ちゃんと path とか設定したつもりで設定できていない罠。多分、自分が Java についてそんなに詳しくないからだと思われ。。。

今回出たエラーはこんな感じ。J2SE 5.0 + Oracle 10g R2 の環境です。

- スポンサーリンク -

Exception in thread "main" java.lang.UnsatisfiedLinkError: /db/u01/app/oracle/product/10.2.0/db/lib32/libocijdbc10.so: /db/u01/app/oracle/product/10.2.0/db/lib32/libocijdbc10.so: cannot open shared object file: No such file or directory
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
        at java.lang.Runtime.loadLibrary0(Runtime.java:822)
        at java.lang.System.loadLibrary(System.java:992)
        at oracle.jdbc.driver.T2CConnection$1.run(T2CConnection.java:4073)
        at java.security.AccessController.doPrivileged(Native Method)
        at oracle.jdbc.driver.T2CConnection.loadNativeLibrary(T2CConnection.java:4069)
        at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:221)
        at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:441)
        at oracle.jdbc.driver.T2CConnection.(T2CConnection.java:132)
        at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtension.java:92)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:839)
        at java.sql.DriverManager.getConnection(DriverManager.java:525)
        at java.sql.DriverManager.getConnection(DriverManager.java:171)

対処方法はこんな感じ。

  1. まずは、httpd 実行ユーザが指定の path にアクセス可能かを調査。今回の場合、apache ユーザが $ORACLE_HOME へのアクセス権がないため、$ORACLE_HOME へのアクセス権を付与した。
  2. 今回のサーバは AMD64 な CPU で RHEL3.0 x86_64 を使っているので、Oracle 10g も 64bit 版を使ってます。Google でいろいろ調べたところ、Java も 64bit が相性が良いらしい。つまりは、Linux AMD64 RPM in self-extracting file ってのをインストール。
  3. それでもまだエラーがでるので、環境変数の設定を変更。最終的にこんな形でうまくいった。
    #JAVA
    export JDK_HOME=/usr/java
    export JAVA_HOME=/usr/java
    export PATH=$PATH:$JDK_HOME/bin
    
    # ORACLE 10gR2
    export ORACLE_BASE=/db/u01/app/oracle
    export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db
    export ORACLE_LIBPATH=$ORACLE_HOME/lib32:$ORACLE_HOME/lib
    export CLASSPATH=./:/usr/local/lib/apache/cgi-bin2/enqsys/:$ORACLE_HOME/jdbc/lib/ojdbc14.jar
    export ORA_NLS10=$ORACLE_HOME/nls/data
    export NLS_LANG=Japanese_Japan.JA16EUC
    export LD_LIBRARY_PATH=$JDK_HOME/lib:$ORACLE_HOME/lib:$ORACLE_HOME/lib32:$ORACLE_HOME/jdbc/lib
    export PATH=$PATH:$ORACLE_HOME/bin
    

3点目は、一応 32bit の共有ライブラリも 64bit の共有ライブラリも LD_LIBRARY_PATH に追加しておくことで、適宜読み込んでよと言う設定。Java 1.4 以降は CLASSPATH には ojdbc14.jar を設定。あと、ORACLE_LIBPATH なんてのも入れておく必要があるみたい。9i の時はこんなの無くても動いてたんですけどね。

あ、それと今回の不具合とは違うんですが、言語環境変数が ORA_NLS33 から ORA_NLS10 に変わってます。

Oracle もバージョンが変わるたびにいろいろと苦労します。

- スポンサーリンク -