JNDIとは その基本的な用途は何ですか?いつ使用されますか?


回答:


241

JNDIとは

これは、Java Naming and Directory Interfaceの略です。

その基本的な用途は何ですか?

JNDIにより、分散アプリケーションは、リソースに依存しない抽象的な方法でサービスを検索できます。

いつ使うの?

最も一般的な使用例は、Java EEアプリケーションサーバーにデータベース接続プールを設定することです。そのサーバーにデプロイされているすべてのアプリケーションjava:comp/env/FooBarPoolは、接続に関する詳細を知らなくても、JNDI名を使用して必要な接続にアクセスできます。

これにはいくつかの利点があります。

  1. アプリがdevl->int->test->prod環境から移動するデプロイシーケンスがある場合、各環境で同じJNDI名を使用して、使用されている実際のデータベースを非表示にすることができます。環境間で移行するため、アプリケーションを変更する必要はありません。
  2. 運用データベースにアクセスするための資格情報を知る必要がある人の数を最小限に抑えることができます。JNDIを使用するかどうかを知る必要があるのは、Java EEアプリサーバーだけです。

9
これは基本的に、jdbc接続情報を含むプロパティファイルを使用するより安全な方法ですか?
2014年

4
@grinch:基本的にそうです。安全で標準化されているため、展開が容易になります(プロパティファイルの名前などを推測する必要はありません)。
sleske 2014年

それでは、環境変数とJNDIの使用の違いは何ですか?似たようなコンセプトですか?
skryvets

100

JNDIとは

JavaネーミングおよびディレクトリインターフェースTM(JNDI)は、Java TMプログラミング言語を使用して記述されたアプリケーションにネーミングおよびディレクトリ機能を提供するアプリケーションプログラミングインターフェース(API)です。特定のディレクトリサービスの実装から独立していると定義されています。したがって、さまざまなディレクトリ(新規、新規、およびすでに配備済み)に共通の方法でアクセスできます。

その基本的な用途は何ですか?

そのほとんどは上記の回答でカバーされていますが、上記がより意味を持つようにここにアーキテクチャを提供したいと思います。

ここに画像の説明を入力してください

JNDIを使用するには、JNDIクラスと1つ以上のサービスプロバイダーが必要です。Java 2 SDK、v1.3には、次のネーミング/ディレクトリサービス用の3つのサービスプロバイダが含まれています。

  1. ライトウェイトディレクトリアクセスプロトコル(LDAP)
  2. Common Object Request Broker Architecture(CORBA)Common Object Services(COS)ネームサービス
  3. Javaリモートメソッド呼び出し(RMI)レジストリ

したがって、基本的にはオブジェクトを作成し、それらを後で検索して操作を実行できるディレクトリサービスに登録します。


30

一般的なJNDIは、基本的には次のような内部/外部リソースのインスタンスを取得できるようにするためのインターフェースです

  javax.sql.DataSource, 
  javax.jms.Connection-Factory,
  javax.jms.QueueConnectionFactory,
  javax.jms.TopicConnectionFactory,
  javax.mail.Session, java.net.URL,
  javax.resource.cci.ConnectionFactory,

または、JCAリソースアダプタによって定義されたその他のタイプ。内部または外部のアクセスを作成できる構文を提供します。つまり、(このインスタンスのcomp / envは、コンポーネント/環境、他の多くの構文があることを意味します):

jndiContext.lookup("java:comp/env/persistence/customerDB");

1
これは画像の一部にすぎません。JNDIを使用すると、Javaオブジェクトをルックアップできます。これらのオブジェクトは、DataSourceなどのリソースでありjava.lang.String、構成情報については単純なものでさえあります。
sleske 2014年

3
@sleske私はあなたがあなた自身の答えを作ることを勧めます。
Ced

14

JNDIの概要

JNDIは、Javaテクノロジで指定されたAPIであり、Javaプログラミング言語で記述されたアプリケーションに命名およびディレクトリ機能を提供します。特にJavaのオブジェクトモデルを使用するJavaプラットフォーム用に設計されています。JNDIを使用すると、Javaテクノロジに基づくアプリケーションは、任意のタイプの名前付きJavaオブジェクトを格納および取得できます。さらに、JNDIは、属性をオブジェクトに関連付けたり、属性を使用してオブジェクトを検索したりするなど、標準のディレクトリ操作を実行するためのメソッドを提供します。

また、JNDIは、特定のネーミングサービスやディレクトリサービスの実装とは無関係に定義されます。これにより、アプリケーションは、共通のAPIを使用して、異なる、場合によっては複数のネーミングおよびディレクトリサービスにアクセスできます。この共通APIの背後で、さまざまなネーミングおよびディレクトリサービスプロバイダーをシームレスにプラグインできます。これにより、Javaテクノロジーベースのアプリケーションは、LDAP、NDS、DNS、NIS(YP)などのさまざまな既存のネームサービスおよびディレクトリサービスの情報を利用できるほか、アプリケーションをレガシーソフトウェアおよびシステムと共存させることができます。

JNDIをツールとして使用すると、Javaのオブジェクトモデルを利用するだけでなく、それらがデプロイされている環境と十分に統合された新しい強力でポータブルなアプリケーションを構築できます。

参照


9

JNDIとは

JNDIは、Java Naming and Directory Interfaceの略です。J2EEに標準で付属しています。

その基本的な用途は何ですか?

このAPIを使用すると、オブジェクト、デバイス、ネーミングファイル、ディレクトリサービスなど、さまざまなタイプのデータにアクセスできます。EJBがリモートオブジェクトを検索するために使用します。JNDIは、DNS、NDS、LDAP、CORBA、RMIなどの既存のサービスにアクセスするための共通インターフェースを提供するように設計されています。

いつ使うの?

JNDIを使用して、名前空間の更新操作や読み取り操作などの名前付け操作を実行できます。ここでは、以下の操作について説明します


7

ネーミングサービスは、名前をオブジェクトに関連付け、指定された名前に基づいてオブジェクトを検索します(RMIレジストリは、ネーミングサービスの良い例です)。JNDIは、LDAP、DNSなどの多くの既存のネームサービスへの共通インターフェースを提供します。

JNDIがない場合、リモートリソースの場所またはアクセス情報は、アプリケーションにハードコーディングするか、構成で使用できるようにする必要があります。この情報を維持することは非常に退屈で、間違いを起こしやすいものです。


3

公式ドキュメントが無視されている理由に興味があります。詳細についてはすでに詳細に説明しています。

ただし、ケースを理解したい場合は、duffymoの回答を参照してください。

JavaネーミングおよびディレクトリインターフェースTM(JNDI)は、Java TMプログラミング言語を使用して記述されたアプリケーションにネーミングおよびディレクトリ機能を提供するアプリケーションプログラミングインターフェース(API)です。特定のディレクトリサービスの実装から独立していると定義されています。したがって、さまざまなディレクトリ(新規、新規、およびすでに配備済み)に共通の方法でアクセスできます。

そしてそのアーキテクチャ

ここに画像の説明を入力してください

そして、通常、それをどのように使用するか


5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyたぶん、普通の人が理解できるほど十分に説明していないからでしょうか?
skryvets

1

1つの例を使用して、アプリケーション開発者がデータベースのユーザー名とパスワードを知らなくても、JNDIを使用してデータベースを構成する方法を説明します。

1)データソースをJBossサーバーのstandalone-full.xmlに設定しました。さらに、プールの詳細も構成できます。

 <datasource jta="false" jndi-name="java:/DEV.DS" pool-name="DEV" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@<IP>:1521:DEV</connection-url>
                <driver-class>oracle.jdbc.OracleDriver</driver-class>
                <driver>oracle</driver>
                <security>
                    <user-name>usname</user-name>
                    <password>pass</password>
                    </security>
                    <security>

 <security-domain>encryptedSecurityDomain</security-domain>
                    </security>

                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                    <background-validation-millis>1</background-validation-millis>
                </validation>
                <statement>
                    <prepared-statement-cache-size>0</prepared-statement-cache-size>
                    <share-prepared-statements>false</share-prepared-statements>
                    <pool>
                        <min-pool-size>5</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                    </pool>
                </statement>
            </datasource>

ここに画像の説明を入力してください

これで、このjndi-nameとそれに関連付けられたデータソースオブジェクトがapplication.applicationで使用できるようになります。

2)JndiDataSourceLookupクラスを使用して、このデータソースオブジェクトを取得できます。

ここに画像の説明を入力してください

Springは、jndi-nameを指定した後で、データソースBeanをインスタンス化します。

これで、環境または要件に従ってプールサイズ、ユーザー名、またはパスワードを変更できますが、アプリケーションには影響しません。

:encryptedSecurityDomain、JBossサーバーで個別に構成する必要があります

<security-domain name="encryptedSecurityDomain" cache-type="default">
                    <authentication>
                        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                            <module-option name="username" value="<usernamefordb>"/>
                            <module-option name="password" value="894c8a6aegc8d028ce169c596d67afd0"/>
                        </login-module>
                    </authentication>
                </security-domain>

これは使用例の1つです。それが明確になることを願っています。


0

私に最も良い説明はここにあります

JNDIとは

これは、ディレクトリサービスへのアクセスを提供するためのAPI です。つまり、オブジェクトとのサービスマッピング名(文字列)、リモートオブジェクトまたは単純なデータへの参照です。これはバインディングと呼ばれます。バインディングのセットはコンテキストと呼ばれます。アプリケーションはJNDIインターフェースを使用してリソースにアクセスします。

簡単に言うと、これはWeb上のリソースを表す文字列キーとオブジェクト値を持つハッシュマップのようなものです。

JNDIが解決する問題

JNDIがない場合、リモートリソースの場所またはアクセス情報は、アプリケーションにハードコーディングするか、構成で使用できるようにする必要があります。この情報を維持することは非常に退屈で、間違いを起こしやすいものです。

たとえば、リソースが別のIPアドレスを使用して別のサーバーに再配置された場合、このリソースを使用するすべてのアプリケーションをこの新しい情報で更新する必要があります。JNDIでは、これは必要ありません。対応するリソースバインディングのみを更新する必要があります。アプリケーションは引き続きその名前でアクセスでき、再配置は透過的です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.