Java Database Connectivity

Java Database Connectivity[1] (JDBC)は、Java関係データベースの接続のためのAPIODBCをベースにサン・マイクロシステムズおよび DataDirect が共同で開発していると言われている。そのためドライバのデフォルトの自動コミットの有効化など似ている点も多々ある。

Java においてSQLを使用して、関係データベース管理システム (RDBMS) などと接続する機能を標準化(抽象化)している。

元はJDK 1.0の拡張APIという位置付けであったが、JDK 1.1で正式にJavaの基本SDKに同梱されるようになった。標準的な機能 (API) は Java SE に含まれている。JDBCの規格は Java SDK とは独立して行われており、APIのアップデートは随時行われている。

ドライバ

JDBCを利用する為には、100% Pure Java 製の Apache Derby が同梱されている Java SE 6 以降のSDK[2]を除き、各DBMS用のJDBCドライバを用意する必要がある。現在開発が行われているほとんどのデータベースではJDBCドライバが用意されている。 これらのドライバを管理するのが JDBC ドライバ・マネージャーである。JDBC ドライバ・マネージャーを用いると、複数のJDBCドライバを同時に利用することができる。JDBCを使うユーザーは、JDBCドライバをロードし(多くはClass.forName("ドライバクラス名")メソッドを利用して呼び出される。また、JDBC4.0以降であればドライバの自動解決が機能するため、DriverManager.getConnnection("jdbc:subprotocol:subname形式のデータベースURL")メソッドを使うことができる。これらのメソッドを利用した場合コンパイラによるそのドライバの依存チェックが行われない為、コンパイル時にドライバをあらかじめ参照できる様に設定しなくて良いなどの利点がある)、JDBC ドライバ・マネージャーを使ってデータベースドライバを取得し、データベースと接続を行って、データベースアプリケーションを記述する事になる。 また、Javaオブジェクト指向言語の特性を生かして、各ドライバはJDBCの基本APIに無い機能を同梱する事もできる。この場合、JDBC APIのスーパーセットのクラスを呼び出すことでこれらの機能を利用可能にすることができる。

たとえば、初期のオラクルOracle Database (Oracle 8) 用JDBCドライバは、当時の JDBC API が BLOBCLOBに対応していなかったため、独自に機能拡張をしてBLOBとCLOBに対応していた。

JDBCドライバのタイプ

JDBCドライバは4つのタイプに分類されている。

タイプ1
JDBC-ODBC ブリッジ JDBCからのクエリー要求を、ODBCを経由して受け渡し、データベースとアクセスするもの。ODBCドライバが必須であり、ハードウェアOSに依存する。Java SE7 までに標準で添付されているドライバでもある。Java7では非推奨となり、Java8では標準から削除された[3]
タイプ2
ネイティブ API ドライバ JDBCからのクエリー要求を、オペーレーティングシステム上のDLLや専用ライブラリに受け渡し、そこからデータベースにアクセスするもの。Type1に比べて階層が薄く済むため高速化が期待できる点とTCP/IPに依存しない利点があるが、やはりハードウェアとオペレーティングシステムに依存する。オラクルでいうとOCIドライバがこれに該当する。
タイプ3
通信プロトコルドライバ JDBCからのクエリー要求を Java で記述されたのドライバ内で独自のプロトコルに変換し、それをアプリケーションサーバを通じてデータベースにアクセスするもの。機種依存・データベース依存をせずに軽量なドライバが作成可能だが、中間サーバを挟むためにパフォーマンスに問題が起きる。
タイプ4
ネイティブプロトコルドライバJDBCからのクエリー要求をすべて Java 上で処理してしまうもの。Java 上にデータベースにアクセスするためのすべての機能を乗せる為、ドライバのサイズが大きくなる、パフォーマンスが若干低下する。基本的にTCP/IPでしか利用できないなどの欠点があるがハードウェアとオペレーティングシステムに依存しないため移植性に優れている。オラクルでいうと thin ドライバがこれ該当する。

タイプ1、タイプ2はDBMSのDLLファイルやライブラリファイルを呼び出す形となるため、JVMのメモリー管理外となる。タイプ3、タイプ4についてはJVM上で Java のクラスとして実装されているためJVM上のガベージコレクションの対象となり管理が行いやすく、流れとしてはTYPE4が主流となっている。

Java とデータベース

後に大規模システム開発において、Java によるアプリケーションソフトウェア開発が一般的になるきっかけとなったのは、関係データベースアクセスを Java から行う JDBC が発表されてからである。

さらに Java で大規模エンタープライズシステムを開発するための仕様「Jakarta EE」には、関係データベースの表(テーブル)の行データを、Javaオブジェクトに1対1に対応させ、オブジェクト内容の永続化=行データの保存というデータのリンクと、オブジェクトのメソッド呼び出し=データベースへのトランザクション処理を同期させる特殊な Java Beans を動作・管理する機構である「エンタープライズ Java ビーンズ」 の「エンティティ・ビーン」が導入された。

EJB 2.1までは、オブジェクト-関係の間にあるインピーダンスミスマッチにより関係データベースの機能を十分に生かせないことや性能面の問題があったが、EJB 3.0以後の仕様により改善されてきている。

EJB 3.2で「エンティティ・ビーン」が廃止され、Java SE および Java EE(現・Jakarta EE)共通向けの、独立した永続化フレームワークJava Persistence API (JPA) に進化した。

JDBCドライバの供給元

脚注

  1. ^ Java JDBC API
  2. ^ JavaDB (Apache Derby) は、エンドユーザ向けのJREには同梱されないため、アプリケーションとともに再配布する必要がある。
  3. ^ http://docs.oracle.com/javase/7/docs/technotes/guides/jdbc/bridge.html

関連項目

外部リンク