1 JDBCの概要
Java Database Connectivity(JDBC)は、Javaからリレーショナル・データベースに接続するためのインタフェースを提供するJava標準です。JDBC標準は定義済で、標準のjava.sql
インタフェースを介して実装されます。このため、各プロバイダは独自のJDBCドライバで標準を実装および拡張できます。JDBCは、X/Open SQLコール・レベル・インタフェース(CLI)に基づいています。JDBC 4.0では、SQL 2003標準を使用してコンパイルします。
この章では、JDBCのOracle実装の概要を説明します。内容は次のとおりです。
1.1 Oracle JDBCドライバの概要
Oracleドライバは、標準JDBC Application Program Interface(API)をサポートする他、Oracle固有のデータ型をサポートし、パフォーマンスを向上させる拡張機能を備えています。
Oracle JDBCドライバを次に示します。
-
Thinドライバ
JDBC Thinドライバは、Pure JavaのType IVドライバで、アプリケーションで使用できます。プラットフォームに依存せず、クライアント側に追加のOracleソフトウェアは必要ありません。JDBC Thinドライバは、Oracle Databaseにアクセスするために、Oracle Net Servicesを使用してサーバーと通信します。
JDBC Thinドライバを使用すると、Javaソケット上にOracle Net Servicesを実装することで、データベースに直接接続できます。このドライバでは、TCP/IPプロトコルがサポートされており、データベース・サーバーのTCP/IPソケットにTNSリスナーが必要です。
ノート:
特定のドライバによってのみサポートされる機能がないかぎり、Thinドライバを使用することをお薦めします。
-
Oracle Call Interface(OCI)ドライバ
クライアント側で使用されるドライバで、Oracleクライアントのインストールが必要です。アプリケーションでのみ使用できます。
JDBC OCIドライバは、Javaアプリケーション用のType IIドライバです。これには、プラットフォーム固有のOCIライブラリが必要です。IPC(プロセス間通信)、名前付きパイプ、TCP/IPおよびInternetwork Packet Exchange/Sequenced Packet Exchange(IPX/SPX)を含む、インストールされたすべてのOracle Netアダプタをサポートします。
JDBC OCIドライバはJavaとCを組み合せて記述されており、Cエントリ・ポイントをコールするネイティブ・メソッドを使用してJDBCの起動をOCIへのコールに変換します。これらのコールでは、Oracle Net Servicesを使用してデータベースと通信します。
JDBC OCIドライバは、インストールされたクライアント・コンピュータにあるOCIライブラリ、Cエントリ・ポイント、Oracle Net、コア・ライブラリおよびその他の必要なファイルを使用します。
OCIは、第3世代言語のネイティブ・プロシージャやファンクション・コールを使用して、Oracle Databaseにアクセスし、SQL文処理のすべての段階を制御するアプリケーションを作成できるようにするAPIです。
-
サーバー側Thinドライバ
機能的にはクライアント側Thinドライバと同じです。ただし、データベース・サーバーで実行され、同じサーバーまたは任意の層のリモート・サーバーで別セッションにアクセスする必要があるコード用です。
JDBCサーバー側Thinドライバは、クライアント側で実行されるJDBC Thinドライバと同じ機能を提供します。ただし、JDBCサーバー側ThinドライバはOracle Databaseの内部で実行され、リモート・データベース、または同じデータベースの別セッションにアクセスし、データベース内のJavaと連携します。
このドライバは、次の場合に役立ちます。
-
中間層として機能を果すOracle Databaseインスタンスからリモートのデータベース・サーバーにアクセスする場合
-
Javaストアド・プロシージャなどのOracle Databaseセッションの内部から別のOracle Databaseセッションにアクセスする場合
JDBC Thinドライバをクライアント・アプリケーションから使用する場合とサーバーの内部から使用する場合で、コード上の違いはありません。
-
-
サーバー側内部ドライバ
データベース・サーバーで実行され、同じセッションにアクセスするコード用です。つまり、このコードは、単一のOracleセッションから実行され、データにアクセスします。
JDBCサーバー側内部ドライバは、Javaストアド・プロシージャなど、Oracle Databaseの内部で実行され、同じデータベースにアクセスする、あらゆるJavaコードをサポートします。このドライバにより、Oracle Java仮想マシン(Oracle JVM)はSQLエンジンと直接通信し、データベース内のJavaと連携します。
JDBCサーバー側の内部ドライバ、Oracle JVM、データベースおよびSQLエンジンは、すべて同じアドレス空間の中で実行されます。このため、ネットワーク・ラウンドトリップの問題は関係ありません。プログラムは、関数呼出しを使用してSQLエンジンにアクセスします。
ノート:
サーバー側内部ドライバでは、
Statement
クラスのcancel
およびsetQueryTimeout
メソッドはサポートされません。JDBCサーバー側内部ドライバは、クライアント側ドライバとの一貫性を保ち、同一の機能と拡張機能をサポートします。
次の表は、Oracle JDBCドライバとOracle Databaseのアーキテクチャを示しています。
1.2 適切なドライバの選択
-
一般的に、TCP/IP以外のネットワークのサポートなどのOCI固有の機能が必要でないかぎり、JDBC Thinドライバを使用します。
-
最大限の移植性とパフォーマンスを実現するには、JDBC Thinドライバを使用します。JDBC Thinドライバを使用すると、アプリケーションからOracle Databaseに接続できます。
-
Secure Sockets Layer (SSL)/Transport Layer Security (TLS)を介してLightweight Directory Access Protocol (LDAP)を使用する場合は、JDBC Thinドライバを使用します。
-
Oracleクライアントの環境で使用するクライアント・アプリケーションを作成し、TCP/IP以外のネットワークのサポートなど、OCIドライバ固有の機能が必要な場合は、JDBC OCIドライバを使用します。
-
データベース・サーバー内で動作し、リモート・データベースまたは同じデータベース・インスタンス内の別のセッションにアクセスする必要があるコードの場合は、JDBCサーバー側Thinドライバを使用します。
-
コードがデータベース・サーバー内で動作し、セッション内でローカルにデータにアクセスする必要がある場合は、JDBCサーバー側内部ドライバを使用して、該当するサーバーにアクセスします。
1.3 JDBC OCIドライバとJDBC Thinドライバの機能の相違点
表1-1は、Oracle Databaseリリース18cのJDBC OCIドライバまたはJDBC Thinドライバ固有の機能の一覧です。
表1-1 JDBC OCIドライバとJDBC Thinドライバの機能の相違点
JDBC OCIドライバ | JDBC Thinドライバ |
---|---|
OCI接続プーリング |
なし |
なし |
ネイティブXAのデフォルト・サポート |
透過的アプリケーション・フェイルオーバー(TAF) |
なし |
なし |
アプリケーション・コンティニュイティ |
なし |
トランザクション・ガード |
なし |
配列DMLの反復ごとの行数のサポート |
なし |
Oracle Advanced SecurityにおけるSHA-2のサポート |
|
なし |
なし |
Oracleアドバンスト・キューイング |
なし |
連続問合せ通知 |
なし |
|
なし |
ローカル・トランザクションからグローバル・トランザクションへの昇格のサポート |
ノート:
-
OCIの最適化フェッチ機能は、JDBC OCIドライバの内部機能であり、JDBC Thinドライバには適用されません。
-
JDBC OCIドライバ機能の一部は、OCIライブラリから継承されたもので、Thin JDBCドライバでは使用できません。
1.4 環境およびサポート
この項では、次の項目について簡単に説明します。
1.4.1 サポートされるJDKおよびJDBCのバージョン
Oracle Database 12cリリース2 (12.2.0.1)では、JDBCドライバはすべてJDK 8と互換性を持ちます。JDK 8のサポートは、ojdbc8.jar
ファイルを介して提供されます。
1.4.2 JNI環境およびJava環境
JDBC OCIドライバは、OCI Cライブラリのコールに、標準Java Native Interface (JNI)を使用しています。Java仮想マシン(JVM)、特にMicrosoft社やIBM社のJVMでJDBC OCIドライバを使用できます。
1.5 機能リスト
次の表は、各機能と、3つのOracle JDBCドライバ(サーバー側内部ドライバ、JDBC OCIおよびJDBC Thinドライバ)でその機能のサポートが開始されたバージョンのリストです。
表1-2 機能リスト
機能 | サーバー側内部 | JDBC OCI | JDBC Thin |
---|---|---|---|
JDK 1.0 |
7.2.2 |
7.2.2 |
|
JDBC 1.0.2 |
7.2.2 |
7.2.2 |
|
JDK 1.1.1 |
8.0.6 |
8.0.6 |
|
JDBC 1.22(新機能なし、マイナーな改訂のみ) |
8.0.6 |
8.0.6 |
|
defineColumnType脚注1 |
8.0.6 |
8.0.6 |
|
行のプリフェッチ |
8.0.6 |
8.0.6 |
|
Java Native Interface |
8.1.6 |
||
JDK 1.2 |
9.0.1 |
8.1.6 |
8.1.6 |
JDBC 2.0 SQL3型( |
8.1.5 |
8.1.5 |
8.1.5 |
ネイティブLOB |
8.1.6 |
9.2.0 |
|
連想配列脚注2 |
10.2.0 |
8.1.6 |
10.1.0 |
JDBC 2.0スクロール可能な結果セット |
8.1.6 |
8.1.6 |
8.1.6 |
JDBC 2.0更新可能な結果セット |
8.1.6 |
8.1.6 |
8.1.6 |
JDBC 2.0標準バッチ処理 |
8.1.6 |
8.1.6 |
8.1.6 |
JDBC 2.0接続プーリング |
なし |
8.1.6 |
8.1.6 |
JDBC 2.0 XA |
8.1.6 |
8.1.6 |
8.1.6 |
サーバー側Thinドライバ |
8.1.6 |
なし |
なし |
JDBC 2.0 RowSet |
9.0.1 |
9.0.1 |
|
暗黙的文キャッシュ |
8.1.7 |
8.1.7 |
8.1.7 |
明示的文キャッシュ |
8.1.7 |
8.1.7 |
8.1.7 |
一時LOB |
9.0.1 |
9.0.1 |
9.0.1 |
オブジェクト型の継承 |
9.0.1 |
9.0.1 |
9.0.1 |
マルチ・レベル・コレクション |
9.0.1 |
9.0.1 |
9.0.1 |
|
9.0.1 |
9.0.1 |
9.0.1 |
ネイティブXA |
9.0.1 |
10.1.0 |
|
OCI接続プーリング |
なし |
9.0.1 |
なし |
TAF |
なし |
9.0.1 |
なし |
NLSサポート |
9.0.1 |
9.0.1 |
9.0.1 |
JDK 1.3 |
9.2.0 |
9.2.0 |
9.2.0 |
JDK 1.4 |
10.1.0 |
9.2.0 |
9.2.0 |
JDBC 3.0セーブポイント |
9.2.0 |
9.2.0 |
9.2.0 |
新規文キャッシュAPI |
9.2.0 |
9.2.0 |
9.2.0 |
ConnectionCacheImpl接続キャッシュ |
なし |
8.1.7 |
8.1.7 |
暗黙的接続キャッシュ |
なし |
10.1.0 |
10.1.0 |
高速接続フェイルオーバー |
10.1.0.3 |
10.1.0.3 |
|
接続ラップ |
9.2.0 |
9.2.0 |
|
DMS |
9.2.0 |
9.2.0 |
|
URLのサービス名 |
9.2.0 |
10.2.0 |
|
JDBC 3.0接続プーリング・プロパティ |
なし |
10.1.0 |
10.1.0 |
JDBC 3.0更新可能なBLOB、CLOB、REF |
10.1.0 |
10.1.0 |
10.1.0 |
JDBC 3.0複数の結果セットのオープン |
10.1.0 |
10.1.0 |
10.1.0 |
JDBC 3.0パラメータ・メタデータ |
10.1.0 |
10.1.0 |
10.1.0 |
JDBC 3.0名前によるストアド・プロシージャ・パラメータの設定/取得 |
10.1.0 |
10.1.0 |
10.1.0 |
JDBC 3.0文プーリング |
10.1.0 |
10.1.0 |
10.1.0 |
名前による文パラメータの設定 |
10.1.0 |
10.1.0 |
10.1.0 |
エンドツーエンドのトレース |
10.1.0 |
10.1.0 |
|
Web RowSet |
11.1 |
10.1.0 |
10.1.0 |
プロキシ認証 |
10.2.0 |
10.1.0 |
|
JDBC 3.0自動生成キー |
10.2.0 |
10.2.0 |
|
JDBC 3.0保持可能カーソル |
10.2.0 |
10.2.0 |
10.2.0 |
JDBC 3.0ローカル・トランザクションとグローバル・トランザクションの切替え |
9.2.0 |
9.2.0 |
9.2.0 |
実行時接続ロード・バランシング |
なし |
10.2.0 |
10.2.0 |
LOB用の |
10.2.0 |
10.2.0 |
|
XA接続キャッシュ |
なし |
10.2.0 |
10.2.0 |
DML RETURNING |
10.2.0 |
10.2.0 |
|
JSR 114 RowSets |
10.2.0 |
10.2.0 |
|
SSL/TLS暗号化 |
9.2.0 |
10.2.0 |
|
SSL/TLS認証 |
9.2.0 |
11.1 |
|
JDK 5.0 |
11.1 |
11.1 |
11.1 |
JDK 6 |
11.1 |
11.1 |
|
JDBC 4.0 |
11.1 |
11.1 |
|
AES暗号化 |
11.1 |
||
SHA1ハッシュ |
11.1 |
||
RADIUS認証 |
10.2.0 |
11.1 |
|
Kerberos認証 |
11.1 |
||
ANYDATAおよびANYTYPE型 |
11.1 |
11.1 |
|
ネイティブAQ |
11.1 |
||
問合せ変更通知 |
11.1 |
||
データベースの起動と停止 |
なし |
11.1 |
11.1 |
データ型のファクトリ・メソッド |
11.1 |
11.1 |
11.1 |
バッファ・キャッシュ |
11.1 |
11.1 |
11.1 |
セキュア・ファイル |
11.1 |
11.1 |
11.1 |
診断機能 |
11.1 |
11.1 |
11.1 |
クライアント結果キャッシュ |
11.1.0 |
18.1 |
|
サーバー結果キャッシュ |
11.1 |
11.1.0 |
11.1.0 |
ユニバーサル接続プール |
11.1.0.7.0 |
11.1.0.7.0 |
|
TimeZoneのパッチ |
11.2 |
11.2 |
|
セキュアなLobのサポート |
11.2 |
11.2 |
|
LOBプリフェッチのサポート |
11.2 |
11.2 |
|
ネットワーク接続プール |
11.2 |
||
列セキュリティのサポート |
11.2 |
||
XML型のキューのサポート(AQ) |
11.2 |
||
通知グループ(AQとDCN) |
11.2 |
||
SimpleFAN |
11.2 |
11.2 |
|
アプリケーション・コンティニュイティ |
12.1 |
||
トランザクション・ガード |
12.1 |
||
SQL文変換 |
12.1 |
||
データベース常駐接続プーリング |
12.1 |
12.1 |
|
最新JDBC標準のサポート |
12.1 |
12.1 |
|
Oracle Advanced SecurityにおけるSHA-2のサポート |
12.1 |
||
非表示列のサポート |
12.1 |
12.1 |
|
パラメータとしてPL/SQLパッケージ・タイプのサポート |
12.1 |
12.1 |
|
データベースの動作の監視のサポート |
12.1 |
12.1 |
|
様々なデータ型の長さの制限拡張のサポート |
12.1 |
12.1 |
|
暗黙的結果のサポート |
12.1 |
12.1 |
|
配列DMLの反復ごとの行数のサポート |
12.1 |
||
|
12.1 |
脚注1
Oracle Database 12cリリース1 (12.1)以降、このメソッドのバリアントのほとんどは非推奨です。LOBからLONGへの変換を実行し、LOBプリフェッチ・サイズを構成できるのは、現在のバージョンのみです。
脚注2
連想配列は、以前は索引付き表と呼ばれていました。
ノート:
-
この表で、N/Aは、対応するOracle JDBCドライバにその機能が当てはまらないことを示します。
-
ConnectionCacheImpl
接続キャッシュ機能はOracle Database 10g以降、非推奨となりました。 -
暗黙的接続キャッシュは今回のリリースからサポートが終了しました。