JDBC
JDBCは、Java とリレーショナルデータベースの接続のためのAPI。JDBCは正式名称であって略称ではないが、テンプレート:ルビに由来する名前だと考えられている[1]。ODBCをベースにサン・マイクロシステムズおよび 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ドライバをロードし(多くはテンプレート:Javadoc:SEメソッドを利用して呼び出される。また、JDBC4.0以降であればドライバの自動解決が機能するため、テンプレート:Javadoc:SEメソッドを使うことができる。これらのメソッドを利用した場合コンパイラによるそのドライバの依存チェックが行われない為、コンパイル時にドライバをあらかじめ参照できる様に設定しなくて良いなどの利点がある)、JDBC ドライバ・マネージャーを使ってデータベースドライバを取得し、データベースと接続を行って、データベースアプリケーションを記述する事になる。 また、Java のオブジェクト指向言語の特性を生かして、各ドライバはJDBCの基本APIに無い機能を同梱する事もできる。この場合、JDBC APIのスーパーセットのクラスを呼び出すことでこれらの機能を利用可能にすることができる。
たとえば、初期のオラクル社の Oracle Database (Oracle 8) 用JDBCドライバは、当時の JDBC API が BLOB[3]、CLOB[4]に対応していなかったため、独自に機能拡張をしてBLOBとCLOBに対応していた。
JDBC ドライバのタイプ
JDBCドライバは4つのタイプに分類されている。
- タイプ1
- JDBC-ODBC ブリッジ JDBCからのクエリー要求を、ODBCを経由して受け渡し、データベースとアクセスするもの。ODBCドライバが必須であり、ハードウェアとOSに依存する。Java SE7 までに標準で添付されているドライバでもある。Java7では非推奨となり、Java8では標準から削除された。[5]
- タイプ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 で大規模エンタープライズシステムを開発するための仕様「Java EE」には、リレーショナルデータベースの表(テーブル)の行データを、Java のオブジェクトに1対1に対応させ、オブジェクト内容の永続化=行データの保存というデータのリンクと、オブジェクトのメソッド呼び出し=データベースへのトランザクション処理を同期させる特殊な Java Beans を動作・管理する機構である「エンタープライズ Java ビーンズ」 の「エンテティ・ビーン」が導入された。
EJB2.1までは、オブジェクトーリレーショナルの間にあるインピーダンスミスマッチによりリレーショナルデータベースの機能を十分に生かせないことや性能面の問題があったが、EJB3.0仕様により改善されてきている。
脚注
- ↑ テンプレート:ルビに由来するとする説もある。
- ↑ JavaDB(Apache Derby)は、エンドユーザ向けのJREには同梱されないため、アプリケーションとともに再配布する必要がある。
- ↑ テンプレート:Lang-en-short
- ↑ テンプレート:Lang-en-short
- ↑ http://docs.oracle.com/javase/7/docs/technotes/guides/jdbc/bridge.html