1 JDBCの概要
Java Database Connectivity(JDBC)は、Javaからリレーショナル・データベースに接続するためのインタフェースを提供するJava標準です。JDBCは、X/Open SQLコール・レベル・インタフェース(CLI)に基づいています。JDBC 4.0では、SQL 2003標準を使用してコンパイルします。
JDBC標準は定義済で、標準のjava.sqlインタフェースを介して実装されます。このため、各プロバイダは独自のJDBCドライバで標準を実装および拡張できます。この章では、JDBCのOracle実装の概要を説明します。内容は次のとおりです。
ノート:
Oracle Database 20cは、限定されたクラウド・プレビューでのみ使用でき、本番環境では使用できません。同様に、Oracle JDBCドライバ20cはダウンロードできません。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ドライバの機能の相違点
次の表に、Oracle Databaseリリース20cの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 環境およびサポート
この項では、JDBCアプリケーションの実行に必要なツールおよび環境について簡単に説明します。
1.4.1 サポートされるJDKおよびJDBCのバージョン
Oracle Database 20cでは、すべてのJDBCドライバがJDK 8、JDK 9、JDK 10およびJDK 11と互換性があり、ojdbc8.jarおよびojdbc10.jarファイルがそれぞれのJDKバージョンに対するサポートを提供します。
ojdbc8.jarファイルを使用する場合
ojdbc8.jarファイルは、JDK 8、JDK 9およびJDK 11でコードをコンパイルする場合に使用します。
ojdbc10.jarファイルを使用する場合
ojdbc10.jarファイルは、JDK 10およびJDK 11でコードをコンパイルする場合に使用します。
1.4.2 JNI環境およびJava環境
JDBC OCIドライバは、OCI Cライブラリのコールに、標準Javaネイティブ・インタフェース(JNI)を使用しています。Java仮想マシン(JVM)、特にMicrosoft社やIBM社のJVMでJDBC OCIドライバを使用できます。
1.4.4 Maven Centralでの可用性
サポートされているすべてのリリースのOracle JDBCドライバ(19.6.0.0、19.3.0.0、18.3.0.0、12.2.0.1、11.2.0.4など)が、Maven Centralで入手できます。そのため、Oracle JDBCドライバおよびコンパニオンJARファイルの配布センターとしてMaven Centralを検討できます。
Maven CentralにおけるJDBCドライバおよびコンパニオンJARファイルのグループID
Maven CentralにおけるすべてのOracle Databaseアーティファクトが、次のイメージに示すように、同じ包括的オブジェクトcom.oracle.databaseの下に存在します。

Oracle Databaseアーティファクトは、その特定のフォーカス領域の下にあります。たとえば、JDBC、XML、セキュリティ、高可用性(HA )、NLS、可などです。次の表に、JDBCドライバおよびコンパニオンJARファイルのグループIDを示します。
| グループID | 対応するJARファイル |
|---|---|
com.oracle.database.jdbc |
ojdbc10.jar、ojdbc8.jar、ojdbc6.jar、ojdbc5,jar、ucp.jar、ojdbc10dms.jar、ojdbc8dms.jar、ojdbc6dms.jar、ojdbcd5dms.jar |
com.oracle.database.jdbc.debug |
ojdbc10_g.jar、ojdbc8_g.jar、ojdbc6_g.jar、ojdbc5_g.jar、ojdbc10dms_g.jar、ojdbc8dms_g.jar、ojdbc6dms_g.jar、ojdbc5dms_g.jar |
com.oracle.database.security |
osdt_core.jar、osdt_cert.jar、oraclepki.jar |
com.oracle.database.ha |
ons.jar, simplefan.jar |
com.oracle.database.nls |
orai18n.jar |
com.oracle.database.xml |
xdb.jar、xdb6.jar、xmlparserv2.jar |
com.oracle.database.observability |
dms.jar |
ノート:
ojdbc8dms.jarおよびojdbc10dms.jarファイルは、Dynamic Monitoring System (DMS)の完全サポートと、java.util.loggingパッケージの制限付きサポートを提供しています。xdb6.jarはレガシー名です。新しい名前はxdb.jarです。
GAVを使用したMaven Centralでの依存性の管理
JDBCとUCPの依存性は、この項で定義されているように、対応するグループID、アーティファクトIDおよびバージョン(GAV)を使用することによってプロジェクトのpom.xmlファイルで管理できます。たとえば、次のGAVは、19.3リリースからojdbc10.jar、ucp.jar、oraclepki.jar、osdt_core.jar、osdt_cert.jar、ons.jarおよびsimplefan.jarを引き出します。
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc10</artifactId>
<version>19.3.0.0</version>
</dependency>同様に、次のGAVでは、19.3.0.0リリースからorai18n.jarファイルを引き出します。
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>19.3.0.0</version>
</dependency>1.5 機能リスト
この項では、サポートされている機能と、JDBC OCIドライバおよびJDBC Thinドライバでその機能が最初にサポートされた対応するバージョンを示します。
表1-2 機能リスト
| 機能 | JDBC OCI | JDBC Thin |
|---|---|---|
|
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.2 |
12.1 |
|
トランザクション・ガード |
12.2 |
12.1 |
|
SQL文変換 |
12.1 |
|
|
データベース常駐接続プーリング |
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 |
|
| 透過的アプリケーション・コンティニュイティ | なし | 18c |
| JSONデータの検証のサポート | 18c | 18c |
| 軽量接続検証のサポート | 18c | |
| REF CURSORをINバインド変数としてサポート | 18c | 18c |
| キーストア・サービスのサポート | 18c | |
| 簡易接続プラス(簡易接続ネーミング構文の改善) | 19c |
ノート:
- JDBCドライバの次の機能は、リリース11.2より前のリリースで導入されました。
- NLSサポート
- 新規文キャッシュAPI
- 行のプリフェッチ
- Javaネイティブ・インタフェース
- ネイティブLOB
- 連想配列/索引付き表
- 暗黙的文キャッシュ
- 明示的文キャッシュ
- 一時LOB
- オブジェクト型の継承
- マルチ・レベル・コレクション
- oracle.jdbcインタフェース
- ネイティブXA
- OCI接続プーリング
- 透過的アプリケーション・フェイルオーバー
- 暗黙的接続キャッシュ
- 高速接続フェイルオーバー
- 接続ラップ
- DMS
- URLのサービス名
- 名前による文パラメータの設定
- エンドツーエンドのトレース
- Web RowSet
- プロキシ認証
- 実行時接続ロード・バランシング
- LOB用の拡張setXXXおよびgetXXX
- XA接続キャッシュ
- DML RETURNING
- JSR 114 RowSets
- SSL/TLS暗号化
- SSL/TLS認証
- AES暗号化
- SHA1ハッシュ
- RADIUS認証
- Kerberos認証
- ANYDATAおよびANYTYPE型
- ネイティブAQ
- 問合せ変更通知
- データベースの起動と停止
- データ型のファクトリ・メソッド
- バッファ・キャッシュ
- セキュア・ファイル
- 診断機能
- サーバー結果キャッシュ
- ユニバーサル接続プール
ConnectionCacheImpl接続キャッシュ機能はOracle Database 10g以降、非推奨となりました。- 暗黙的接続キャッシュ機能はサポート終了になりました。
