【Java】Java初心者の鬼門とも言えるJNDIとは?【How To】

monmosu_kinoko
JNDIって理解せずに使用している人多いと思います。概要でもよいのでとりあえず覚えた方が色々とよいです。

■JNDIってなんぞや?

JNDI とは Java Naming and Directory Interface の頭文字を取ったもので、Java から
ネーミング・サービス
ディレクトリー・サービス
を扱うためのインターフェイスを規定した仕様です。
「インターフェイス」ですので、JNDI ではネーミング・サービスやディレクトリー・サービスそのものは提供しません。あくまでも、他の実装で提供されるサービスを Java から利用するためのしくみが JNDI です。
今さら人に訊けない JNDI: 第 1 回 「JNDI ってなんだっけ?」

はい、いきなり2つほどよくわからないのが出てきましたねー。
ネーミングサービス?ディレクトリサービス?何いってんだこいつ?と最初思う人結構いるかと思います。では、この2つをまず説明したいと思います。

■ネーミング・サービス

名前をオブジェクトに関連付けたり、名前を基に関連付けられたオブジェクトを検索することのできるサービスです。 元々はCORBAという分散処理を行う際にローカルからリモートといった離れた場所にあるオブジェクトを取得する為に 定義された仕様になります。具体的にどのようなことを行うか以下に記載します。

——-
開発者がサーバBでとある文字列を返すメソッドを作ろうと考えました。
その処理サーバAで作成済みであるため、サーバBで呼び出せばよいと考えました。
以下のリモートメソッドを参照(lookup)するようにしました。

例)

// ORBの生成と初期化
ORB orb = ORB.init(“ホスト名とポート番号”, null);
// ネームサービスへの参照を取得
org.omg.CORBA.Object objRef =
orb.resolve_initial_references(“文字列を返すネームサービス”);
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
TestHelper t = HelloHelper.narrow(ncRef.resolve_str());
//メソッドを呼び出し[[BR]] System.out.println(t.getMessage());

また、呼ばれる側でネームサービスを登録することをBIND(バインド)といいます。 これによって呼び出したいものを別途登録することができるということです。

※CORBAとは様々な言語(C,C++,smalltake,java,LISP,Ada,COBOL等)をリモートで相互に呼び出せるようOMGという団体により仕様策定されました。

■ディレクトリサービス

ディレクトリサービスとは、ネットワークを利用するユーザ名やマシン名などの様々な情報を管理するためのサービスのことで、ユーザ名などのキーとなる値から様々な情報を検索することが可能です。
ディレクトリサービスは、ローカルに限ってサービスを提供する場合もありますが、グローバルにサービスを提供する場合もあります。代表的な製品はMicrosoftのActiveDirectoryなどがあります。

ネーミングサービス、ディレクトリサービスでアクセスできるサービス

・DNS (Domain Name Service)
・LDAP (Lightweight Directory Access Protocol)
・NIS (Network Information System)
・COS (Common Object Service)
・RMI (Remote Method Invocation)

また、J2EEなどで使用可能な「環境ネーミングコンテキスト(ENC)」と呼ばれる昔ながらのJDBC接続でお馴染みな
「java:comp/env・・・」などの情報も取得することが出来ます。

ENCについては、アプリケーションサーバ毎に取得方法が異なりますが、よく使用されるTomcatで使用可能なENCを
参考までに記載します。

JNDI ルックアップ名(関連する参照)
java:comp/env (アプリケーション環境エントリ)
java:comp/env/jdbc (JDBC データソースリソースマネージャ接続ファクトリ)
java:comp/env/ejb (EJB 参照)
java:comp/UserTransaction (UserTransaction 参照)
java:comp/env/mail (JavaMail セッション接続ファクトリ)
java:comp/env/url (URL 接続ファクトリ)
java:comp/env/jms (JMS 接続ファクトリと送信先)
java:comp/ORB (アプリケーションコンポーネント間で共有された ORB インスタンス)

例)

Postgresへ接続する為のデータソース情報を取得する場合

InitialContext cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup( “java:/comp/env/jdbc/postgres” );
最近のアプリケーション開発などでは、あまり分散処理をやるという話は聞きません。
また、JNDIを使う場合は大体データベースに接続する場合が多いので、ENCについてとりあえず覚えておくと良いと思います。
ただ最近はO/Rマッパーが主流だったりするので、これもあまり使われないのかなぁ

https://matome.naver.jp/odai/2139087889060693301
2014年01月28日