<目次>
(1) JNDIとは?JDBCとの違いやメリット・デメリットについてもご紹介
(1-1) JDBCとは?
(1-2) JNDIとは?
(1-2-1) 概要
(1-2-2) JNDIのメリット
(1-2-3) 「ネーミング/ディレクトリサービス」の種類
(1-2-4) JNDIのアーキテクチャ
(1-3) JDBCとJNDIの違い
(1) JNDIとは?JDBCとの違いやメリット・デメリットについてもご紹介
(1-1) JDBCとは?
JDBCは「Java Database Connectivity」の略で、データベースへの接続を扱うためのAPIです。具体的には、DBへの接続、DBへのクエリ発行、クエリ結果の取得といったデータベースに対する各種操作を行う事ができます。
JDBCでは接続文字列やドライバーを直接指定し、1つの接続を確立します。そして他のリクエストは、接続中のコネクションが終了するまで「待つ」必要があるため、性能の問題を回避するため、一般的には「
コネクションプール」の設定を行います。
JDBCやコネクションプールについては下記の記事もご参考ください。
(1-2) JNDIとは?
(1-2-1) 概要
JDNIは「Java Naming and Directory Interface」の略で、後述する「ネーミング/ディレクトリサービス」にアクセスするためのインターフェイスを提供するJava言語のAPIです。
非常に良く使われる用途として、JavaEEアプリケーションにおいてデータベースの「コネクションプール」を作る際などで利用されます。コネクションプールはデータソース(DBへの接続生成工場のようなもの=java.sql.Datasourceクラス)を用いて複数のコネクションを用意します。
具体的にはJNDIディレクトリの中に「JDBC」のデータソースを保持しているため、JNDIのルックアップでの接続は、内部的にはJDBC接続を利用しています。
ってこの説明だけでは意味不明ですよね・・
JNDIは一言で表すと、Javaの「アプリケーションと設定情報とを分離するための仕組み」です(※分離する事で、お互いが影響を受けにくくなる)。
>目次にもどる
(1-2-2) JNDIのメリット
●汎用性が高い
これらの一連の設定(DBへの接続設定など)はアプリケーションサーバ(TomcatやWebLogicなど)にて設定・管理されているため、ご自身のアプリケーションにはJNDIに関する設定情報は書かずに済むというメリットもあります(DB情報変更によるプログラム修正を防げる)。
●性能面
INSERTが少なくSELECTが多い場合はJNDIの方が高性能と言われています。またコネクションプールなど、多数のアクセスが集まるWebアプリ等においては、逐一DBコネクションを確立するのは負荷が高いため、コネクションプールの利用(つまりJNDIの利用)が必須となってきます。
(1-2-3) 「ネーミング/ディレクトリサービス」の種類
各サービスプロバイダが提供するJNDIの機能を「ネーミング/ディレクトリサービス」と呼んでおり、実態はJNDI APIのContextやDirContextインターフェイスを実装したものになります。
「ネーミング/ディレクトリサービス」にはいくつかの種類があり、JNDI APIを使用する事でこれらの「ネーミング/ディレクトリサービス」と通信が可能になります。
(例)
・LDAP=Light Weight Directory Access Protocol(OSS)
・DNS=Domain Name Service
・ADS=Active Directory Server from Microsoft
・NDS=Novel Directory Server from Novel
これらの「ネーミング/ディレクトリサービス」機能は、商用のアプリケーションサーバの機能の一部として組み込まれている事が多く、例えば以下のような製品が挙げられます。
・WebLogic(Oracle)
・WebSphere(IBM)
・JBoss(Red Hat)
(1-2-4) JNDIのアーキテクチャ
JNDIのアーキテクチャは次のような構造になっています。
(図121)
●JNDI API
Javaの開発者が「ネーミング/ディレクトリサービス」を利用する際に使用するAPIで、コネクションプールによるDBアクセスもこのAPIを使っています。JDNIの主な構成パッケージは次の2つです。
①javax.naming
名前とオブジェクト(やアドレス)の関係づけを行い、階層に整理します。分かりやすい例ではDNS(Domain Name Service)において、IPアドレスとドメイン名の対応付けを行うなどです。中核となるインターフェイスやクラスは以下の4つです。
(表)
Context |
一意名の「Binding」の集合体。 |
Binding |
名前とオブジェクトの対応。 |
Name、NameParser |
名前の操作に使用。 |
②javax.naming.directory
ディレクトリオブジェクトへのアクセス機能を提供します。オブジェクトへのアクセスに際しては「Attribute」と呼ばれる識別子や値を使って、検索を行います。中核となるインターフェイスは次の通りです。
(表)
DirContext |
0個以上のAttributeを保持したContext。 |
Attribute |
オブジェクトと紐づく識別子と0個以上の値を持った属性です。 |
Attributes |
DirContextオブジェクトと関連したAttributeの集合体。 |
●JNDI SPI
JNDI SPI(Service Provider Interface)はJavaアプリの開発者は殆ど触れる機会がなく、どちらかというとNDSといった「ネーミング/ディレクトリサービス」のプロバイダが、ネーミングの仕組みを実装する際に使用するインターフェイスです。
(1-3) JDBCとJNDIの違い
両者を一言で簡単に表現するなら・・
●JDBC
Javaでデータベース接続するためのAPIで、SQLの発行等を行います。
●JNDI
Javaのアプリケーションと設定情報とを分離するための仕組みです。
例えばコネクションプール等でDB接続する場合も、アプリケーション側ではJNDIによって定義された名前を指定してDBに接続する事が出来るため、アプリケーション内にDBの認証情報(ID、パスワード)等を記述する必要がなくなります。コネクションプールも内部的にはJDBCドライバを指定しているため、JNDIを用いたDB接続においてはJDBCを利用していると言えます。