JDBCとは

JDBCとはJAVAからデータベースへ接続するためのAPI郡です。 JDBCという用語自体はoracle独自のものではなく、javaからデータベースに接続するための標準規格で様々なベンダーが独自のJDBCを提供しています。

ORACLE製のJDBCドライバは$ORACLE_HOME/jdbc/lib配下にインストールされており、 JDKのバージョン(java.exeのバージョン)によって使用するjarファイルを使い分ける必要があります。

  • classes111.jar:JDK1.1
  • classes12.jar :JDK1.2~JDK1.3
  • ojdbc14.jar :JDK1.4~JDK5(JDK1.5)
  • ojdbc5.jar :JDK5(JDK1.5)
  • ojdbc6.jar :JDK6(JDK1.6)
  • ojdbc7.jar :JDK7(JDK1.7)

なお、*_g.jarというファイルも用意されていることがありますがこれはデバッグ機能付きのJDBCであり 本番環境で使用するためのJDBCドライバではありません。

JDBCのタイプ

JDBCの接続には4つのタイプがあり、主にtype2とtype4が使用されています。

・Type2(OCI)
Type2(OCI)はJDBCドライバよりoracleのC言語で書かれたクライアントライブラリ(OCIライブラリ)を内部的に使用して接続を行う方法です。 Type2で接続するためにはoracleクライアントのインストールが必要です。

・Type4(Thin)
Type4(Thin)はJDBCドライバのみで接続を行う方法です。 oracleクライアントのインストールが不要でJDBCドライバをコピーするだけで使用できる簡便さからこちらが使用されるケースが多くみられます。

このほかに、DBに内臓されたJDBCで接続する方式もあります(主にJava Stored Procedure内でDB接続が必要な場合に使用)。

接続先の指定方法

以下のサンプルの通り接続先の基本の指定方法は以下のような形です。
"jdbc:oracle:thin:@HOST名:ポート番号:SIDやサービス名", "ユーザ", "パスワード"
ですが、この指定方法の場合RAC環境等で必要なロードバランスの設定やフェイルオーバ等の設定を行うことができません。 こういったケースの場合は以下のように"@"以下にtnsnames.oraで指定する形式を設定します。
(以下はjavaのソース内で使用する場合です。プロパティファイル等に記載する場合は「"」や「+」を外します)
"jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=ON)" +
"(ADDRESS=(PROTOCOL=TCP)(HOST=host名1) (PORT=ポート番号))" +
"(ADDRESS=(PROTOCOL=TCP)(HOST=host名2) (PORT=ポート番号))" +
"(CONNECT_DATA=(SERVICE_NAME=サービス名)))", "ユーザ", "パスワード"
また、OCI接続の場合はデフォルトで以下のようにtnsnames.oraに記載した接続識別子を指定することが可能です。
"jdbc:oracle:oci:ユーザ/パスワード@接続識別子"
thinの場合は明示的にoracle.net.tns_adminシステムプロパティを設定することでOCI接続の場合と同様にtnsnames.oraに記載した接続識別子を指定することが可能です。 システムプロパティは以下のようにソースレベルでSystem.setPropertyメソッドにて設定するほか、java起動時のオプション(-Doracle.net.tns_admin=/app/oracle/product/10.2.0/db_1/network/admin 等)で指定することも可能です。   
System.setProperty("oracle.net.tns_admin", "tnsnames.oraのパス");
Class.forName("oracle.jdbc.driver.OracleDriver");
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@接続識別子", "ユーザ", "パスワード");

JDBCのサンプルプログラム

サンプルプログラム1(Thin(Type4)で接続し「接続成功」という文字を出力する)
test.java
import java.sql.*;
import java.sql.PreparedStatement;
import oracle.jdbc.driver.*;

class test {
    public static void main (String args []) throws SQLException{
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    Connection conn = DriverManager.getConnection
                ("jdbc:oracle:thin:@HOST名:ポート番号:SIDやサービス名", "ユーザ", "パスワード");
      PreparedStatement pstm = conn.prepareStatement("SELECT '接続成功' FROM DUAL");
      ResultSet rset = pstm.executeQuery();
      while(rset.next())
         System.out.println(rset.getString(1));
      rset.close();
      pstm.close();
      conn.close();
    }
}
実行例
C:\>cd /d E:\ ソースが置いてあるパスへ移動
E:\>set CLASSPATH=.;E:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar 使用するjarファイルを設定
E:\>C:\j2sdk1.4.2_17\bin\javac.exe E:\test.java コンパイル
E:\>java test 実行
接続成功
Type4(Thin)接続時固有のトラブルシューティング
Exception in thread "main" java.sql.SQLException: I/O例外です。: The Network Ada
pter could not establish the connection
指定したHOST名またはIPアドレスが参照できなかったか、指定したポート番号が 誤っている場合に出力されますので以下を確認します。

・HOST名ではなくIPアドレスで指定した場合接続できるか
→接続できた場合はDNSまたはhostsファイルによる名前解決ができていません。
 DNSに登録するか、hostファイルを修正します
・指定したHOST名またはIPアドレスに対してリスナーのポート番号に対してtelnetで接続できるか
 例) telnet <hostname> 1521
→telnetで接続できない場合はORACLEへの接続する以前にTCP/IPの通信ができていません

サンプルプログラム2(OCI(Type2)で接続し日付を出力する)
test.java
import java.sql.*;

public class test {
    public static void main (String args[])  throws Exception {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        Connection conn = DriverManager.getConnection
        ("jdbc:oracle:oci:ユーザ/パスワード@接続文字列");
        Statement stmt = conn.createStatement();
        ResultSet rset = stmt.executeQuery("select sysdate from dual");
        while ( rset.next() ) {
            System.out.println(rset.getDate(1) + "\t");
        }
        rset.close();
        stmt.close();
        conn.close();
    }
}
実行例
C:\>cd /d E:\ ソースが置いてあるパスへ移動
E:\>set CLASSPATH=.;E:\oracle\product\10.2.0\db_1\jdbc\lib\14.jar 使用するJDBCのjarファイル設定
E:\>set Path=C:\j2sdk1.4.2_17\bin;E:\oracle\product\10.2.0\db_1\bin;%PATH% ORACLE_HOME/binを設定
E:\>C:\j2sdk1.4.2_17\bin\javac.exe E:\test.java コンパイル
E:\>java test 実行
2007-10-20

Type2(OCI)接続時固有のトラブルシューティング
・エラー1
Exception in thread "main" java.lang.UnsatisfiedLinkError:
 no ocijdbc10 in java.library.path
OCI接続時にはJAVAのライブラリ(ojdbc5.jarやclasses12.jar等)からORACLEのOCIライブラリを経由してDBへの接続を行いますが、 このときocijdbc10というライブラリを読み込もうとしたが読み込めなかった場合に出力されるエラーです。 したがって指定したライブラリを読み込めるように環境変数を設定することで解消します。 なお、64bit環境の場合で32bit用ライブラリ($ORACLE_HOME/lib)を使用したい場合(※)は$ORACLE_HOME/lib(64bit用ライブラリ)ではなく$ORACLE_HOME/lib32を指定します。 また、ocijdbc10というライブラリ自体がない場合はOracle Clientがインストールされていませんのでインストールする必要があります。

- windows環境の場合
→環境変数PATHに%ORACLE_HOME%\binを追加します
- Linux、Solaris環境の場合
→環境変数LD_LIBRARY_PATHに$ORACLE_HOME/libを追加します
- HP-UX環境の場合
→環境変数LD_LIBRARY_PATHまたはSHLIB_PATHに$ORACLE_HOME/libを追加します
- AIX環境の場合
→環境変数LIBPATHに$ORACLE_HOME/libを追加します

※11.2では64bit製品に32bitライブララリが含まれなくなっています

・エラー2
Exception in thread "main" java.sql.SQLException:
ORA-12154: TNS:could not resolve the connect identifier specified
tnsnames.oraが読み込めなかったか、tnsnames.oraの中で指定した接続文字列が見つからなかった場合に出力されるエラーです。 %ORACLE_HOME%\network\admin\tnsnames.oraの中に指定した接続文字列が存在しているか確認します。 クライアントからの接続設定(2)もあわせて確認してみてください。

マニュアル

JDBC開発者ガイドおよびリファレンス
Java 開発者ガイド
★ORACLE案件承ります