JNDI を使用するアプリケーションの開発

エンタープライズ Bean (EJB) ホームおよびその他の成果物 (データ・ソースなど) への参照は、 WebSphere® Application Server 名前空間にバインドされます。 これらのオブジェクトは、Java™ Naming and Directory Interface (JNDI) を介して取得できます。 初期コンテキストを取得するまでは、JNDI 操作を実行できません。 この初期コンテキストを使用して、名前空間にバインドされているオブジェクトを検索できます。

このタスクの概要

これらの例では、 WebSphere Application Server JNDI コンテキスト実装に固有のフィーチャーのデフォルトの動作が使用されます。

WebSphere Application Server JNDI コンテキスト実装には、特殊フィーチャーが含まれています。 JNDI キャッシングは、同じオブジェクトに対して繰り返し行われる検索操作のパフォーマンスを強化します。 名前構文オプションでは名前構文を選択することができます。1 つは通常の JNDI クライアントに最適化され、1 つは CosNaming アプリケーションとのインターオペラビリティーに最適化されています。 ほとんどの場合、これらのフィーチャーのデフォルトの振る舞いは、優先される動作です。 ただし、特定の状況においてはその振る舞いを変更しなければならない場合もあります。

JNDI キャッシングおよび名前構文オプションは、javax.naming.InitialContext インスタンスと関連付けられています。 これらのフィーチャーのオプションを選択するには、 WebSphere Application Server 初期コンテキスト・ファクトリーで認識されるプロパティーを設定します。 初期コンテキスト・ファクトリーに対して可視の JNDI キャッシングまたは名前構文プロパティーを設定するには、以下のステップに従ってください。

手順

  1. オプション: JNDI キャッシュの構成

    JNDI キャッシングによって、JNDI 検索操作のパフォーマンスを大幅に向上できます。 デフォルトでは、JNDI キャッシングが有効になっています。 ほとんどの状況において、このデフォルト設定が望ましい振る舞いになります。 ただし、状況によっては、他の JNDI キャッシュ・オプションを使用してください。

    検索されたオブジェクトは、ローカルにキャッシュされます。 キャッシュされたオブジェクトに対する以降のルックアップは、ローカルで解決されます。 ただし、キャッシュ・コンテンツに不整合が生じる可能性があります。 検索対象のオブジェクトの大部分は頻繁には変更されないため、通常、このことは問題になりません。 比較的頻繁に変更されるオブジェクトを検索しなければならない場合には、JNDI キャッシュ・オプションを変更してください。

    JNDI クライアントでは、キャッシュの振る舞いを制御するために使用できるプロパティーがいくつかあります。

    プロパティーは、以下の方法で設定できます。
    • コマンド行から、実際のストリング値を入力して設定します。 以下に例を示します。
      java -Dcom.ibm.websphere.naming.jndicache.maxentrylife=1440
    • jndi.properties ファイルで、必要なプロパティー設定を指定したテキスト・ファイルとして、jndi.properties という名前のファイルを作成して設定します。 以下に例を示します。
      ...
      com.ibm.websphere.naming.jndicache.cacheobject=none
      ...

      この方法で設定する場合は、jndi.properties ファイルの他のインスタンスが クラスパス内に存在している可能性があること、および jndi.properties ファイルの他のインスタンスに 競合するプロパティー設定が含まれている可能性があることに注意してください。 プロパティー設定は、 クラス・ローダーが jndi.properties ファイルを選出する順序によって決定されます。 クラス・ローダーがクラスパスにファイルを配置する際に使用する順序を制御する方法はありません。 WebSphere Application Server には、 com.ibm.websphere.naming.jndicache.cacheobject プロパティーを設定する jndi.properties ファイルが最初から含まれていたり、作成されたりすることはありません。

    • Java プログラム内で、com.ibm.websphere.naming.PROPS ファイルに定義されている、PROPS.JNDI_CACHE* Java 定数を使用して設定します。 定数の定義内容は以下のとおりです。
      public static final String JNDI_CACHE_OBJECT =
       "com.ibm.websphere.naming.jndicache.cacheobject";
      public static final String JNDI_CACHE_OBJECT_NONE      = "none";
      public static final String JNDI_CACHE_OBJECT_POPULATED = "populated";
      public static final String JNDI_CACHE_OBJECT_CLEARED   = "cleared";
      public static final String JNDI_CACHE_OBJECT_DEFAULT   =
       JNDI_CACHE_OBJECT_POPULATED;
      
      public static final String JNDI_CACHE_NAME =
       "com.ibm.websphere.naming.jndicache.cachename";
      public static final String JNDI_CACHE_NAME_DEFAULT = "providerURL";
      
      public static final String JNDI_CACHE_MAX_LIFE =
       "com.ibm.websphere.naming.jndicache.maxcachelife";
      public static final int    JNDI_CACHE_MAX_LIFE_DEFAULT = 0;
      
      public static final String JNDI_CACHE_MAX_ENTRY_LIFE =
       "com.ibm.websphere.naming.jndicache.maxentrylife";
      public static final int    JNDI_CACHE_MAX_ENTRY_LIFE_DEFAULT = 0;

      Java プログラムにある以前のプロパティーを使用するためには、以下のようにして、hashtable にプロパティー設定を追加し、それを InitialContext コンストラクターに渡します。

      java.util.Hashtable env = new java.util.Hashtable();
      ...
      
      // Disable caching
      env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); ...
      javax.naming.Context initialContext = new javax.naming.InitialContext(env);

    以下の例は、要求するキャッシュの動作を達成するために JNDI キャッシュのプロパティーを使用する方法を示しています。 キャッシュのプロパティーは、InitialContext オブジェクトが構成されたときに有効になります。

    例: プログラムからの JNDI キャッシュの動作の制御

    import java.util.Hashtable;
    import javax.naming.InitialContext;
    import javax.naming.Context;
    import com.ibm.websphere.naming.PROPS;
    
    /*****
     Caching discussed in this section pertains to the WebSphere Application Server initial context factory.
     Assume the property, java.naming.factory.initial, is set to
     "com.ibm.websphere.naming.WsnInitialContextFactory" as a java.lang.System property.
    *****/
    
    Hashtable env;
    Context ctx;
    
    // To clear a cache:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_CLEARED);
    ctx = new InitialContext(env);
    
    // To set a cache's maximum cache lifetime to 60 minutes:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_MAX_LIFE, "60");
    ctx = new InitialContext(env);
    
    // To turn caching off:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE);
    ctx = new InitialContext(env);
    
    // To use caching and no caching:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_POPULATED);
    ctx = new InitialContext(env);
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE);
    Context noCacheCtx = new InitialContext(env);
    
    Object o;
    
    // Use caching to look up home, since the home should rarely change.
    o = ctx.lookup("com/mycom/MyEJBHome");
    // Narrow, etc. ...
    
    // Do not use cache if data is volatile.
    o = noCacheCtx.lookup("com/mycom/VolatileObject");
    // ...

    例: JNDI を使用した JavaMail セッションの検索

    次の例は、JavaMail リソースの検索を示しています。

    // Get the initial context as shown previously
    ...
    Session session =
         (Session) initialContext.lookup("java:comp/env/mail/MailSession");
  2. オプション: 名前構文を指定します

    INS 構文 は、CORBA アプリケーションとの相互運用が必要な JNDI クライアント用に設計されています。 この構文を使用すると、JNDI クライアントは、CORBA 名との間で正しくマッピングを行うことができます。 INS 構文は、追加の特殊文字であるドット (.) を使用する JNDI 構文と非常によく似ています。 ドットは、名前コンポーネント内の id フィールドと kind フィールドを区切るために使用されます。 ドットは、エスケープされると、文字どおりに解釈されます。 名前コンポーネント内で使用できるエスケープされないドットは、1 つだけです。 空でない id フィールドと空の kind フィールドを持つ名前コンポーネントは、id フィールド値によってのみ表され、エスケープされないドットで終わることはできません。 空の名前コンポーネント (空の id および空の kind フィールド) は、エスケープされない単一のドットで表されます。 空のストリングは、無効な名前コンポーネント表記です。

    JNDI 名前構文 は、デフォルト構文であり、一般的な JNDI クライアントに適しています。 この構文には、スラッシュ (/) と円記号 (¥) の特殊文字が含まれます。 名前に含まれるコンポーネントは、スラッシュで区切られます。 円記号は、エスケープ文字として使用します。 スラッシュは、エスケープされると (つまり、その前に円記号を置くと) 文字どおりに解釈されます。 同様に、円記号は、エスケープされると文字どおりに解釈されます。

    ほとんどの WebSphere アプリケーションは、JNDI を使用して EJB オブジェクトを検索するため、CORBA アプリケーションによってバインドされたオブジェクトを検索する必要はありません。 したがって、JNDI 名に使用されるデフォルトの名前構文が最も便利です。 CORBA アプリケーションによりバインドされたオブジェクトの検索を必要とするアプリケーションの場合、すべての CORBA CosNaming 名を表示できるように名前構文を変更しなければならない可能性があります。

    JNDI クライアントは、プロパティーの設定により名前構文を設定できます。 新規 java.naming.InitialContext オブジェクトのインスタンス生成時に、初期コンテキスト・ファクトリーによってプロパティー設定が適用されます。 初期コンテキストでの JNDI 操作で指定される名前は、指定された名前構文に従って解析されます。

    プロパティーは、次のようにして設定することができます。

    • コマンド行から、実際のストリング値を入力します。 以下に例を示します。
      java -Dcom.ibm.websphere.naming.name.syntax=ins
    • 必要なプロパティー設定をしたテキスト・ファイルとして、jndi.properties という名前のファイルを作成します。 以下に例を示します。
      ...
      com.ibm.websphere.naming.name.syntax=ins
      ...

      この方法で設定する場合は、jndi.properties ファイルの他のインスタンスが クラスパス内に存在している可能性があること、および jndi.properties ファイルの他のインスタンスに 競合するプロパティー設定が含まれている可能性があることに注意してください。 プロパティー設定は、 クラス・ローダーが jndi.properties ファイルを選出する順序によって決定されます。 クラス・ローダーがクラスパスにファイルを配置する際に使用する順序を制御する方法はありません。 WebSphere Application Server には、 com.ibm.websphere.naming.name.syntax プロパティーを設定する jndi.properties ファイルが最初から含まれていたり、作成されたりすることはありません。

    • Java プログラムの com.ibm.websphere.naming.PROPS ファイルに定義されている PROPS.NAME_SYNTAX* Java 定数を使用して設定します。 定数の定義内容は以下のとおりです。
      public static final String NAME_SYNTAX =
          "com.ibm.websphere.naming.name.syntax";
      public static final String NAME_SYNTAX_JNDI = "jndi";
      public static final String NAME_SYNTAX_INS  = "ins";

      Java プログラムにある以前のプロパティーを使用するためには、以下のようにして、hashtable にプロパティー設定を追加し、それを InitialContext コンストラクターに渡します。

      java.util.Hashtable env = new java.util.Hashtable();
      ...
      env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS); // Set name syntax to INS
      ...
      javax.naming.Context initialContext = new javax.naming.InitialContext(env);

    例: 名前ストリングの構文解析のために使用する構文の設定

    システム・プロパティーまたは jndi.properties ファイルでは、パラメーターを介して InitialContext コンストラクターに名前構文プロパティーを渡すことができます。 初期コンテキストおよびそのコンテキストから検索されるコンテキストでは、指定された構文に基づいて名前ストリングを構文解析します。

    以下の例は、初期コンテキストが INS 構文に従って名前ストリングの構文解釈を行うよう、名前構文を設定する方法を示しています。

    ...
    import java.util.Hashtable;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import com.ibm.websphere.naming.PROPS; // WebSphere naming constants
    ...
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
          "com.ibm.websphere.naming.WsnInitialContextFactory");
    env.put(Context.PROVIDER_URL, ...);
    env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS);
    Context initialContext = new InitialContext(env);
    // The following name maps to a CORBA name component as follows:
    //    id = "a.name", kind = "in.INS.format"
    // The unescaped dot is used as the delimiter.
    // Escaped dots are interpreted literally.
    java.lang.Object o = initialContext.lookup("a\\.name.in\\.INS\\.format");
    ...

    INS name syntax requires that embedded periods (.) in a name such as in.INS.format be escaped using a backslash character (\). In a Java String literal, a backslash character (\) must be escaped with another backslash character (\\).

  3. オプション: ホスト名の正規化を無効にする

    プロバイダーの URL のホスト名、IP アドレス、および localhost への参照は、 通常、正規化されます。 正規化されたホスト名の形式は、完全修飾形式のホスト名です。 ホスト名の正規化により、プロバイダー URL の参照形式に関係なく、 特定のブートストラップ・ホストに同じ JNDI キャッシュを使用することができるため、 システム効率が向上します。 例えば、myhostmyhost.mydomain.com、 および localhost という参照がすべて同じホストを参照している場合、 ホスト名を正規化することにより、これらの参照に同じ JNDI キャッシュを使用することができます。

    正規化されたホスト名はキャッシュに入れられるため、 後続の正規化の実行はより速くなります。 一部のネットワーク環境では、 ドメイン・ネーム・ルックアップ・データが動的に変化することにより、 キャッシュに入れられたホスト名の正規化データが失効します。 このような環境では、ホスト名の正規化を無効にする必要があるかもしれません。 ホスト名の正規化を無効にすると、ホスト名および IP アドレスはそのまま使用されます。 localhost への参照は、通常、ループバック・アドレス 127.0.0.1 に解決されます。

    JNDI クライアントは、プロパティーの設定により、ホスト名の正規化を無効にすることができます。 新規 java.naming.InitialContext オブジェクトのインスタンス生成時に、初期コンテキスト・ファクトリーによってプロパティー設定が適用されます。

    以下のいずれかの方法を使用して、このプロパティーを設定します。
    • コマンド行から実際のストリング値を入力することができます。 以下に例を示します。
      java -Dcom.ibm.websphere.naming.hostname.normalizer=...none...
    • 必要なプロパティーを設定した jndi.properties という 名前のテキスト・ファイルを作成することができます。 以下に例を示します。
      ...
      com.ibm.websphere.naming.hostname.normalizer=...none...
      ...

      この方法で設定する場合は、jndi.properties ファイルの他のインスタンスが クラスパス内に存在している可能性があること、および jndi.properties ファイルの他のインスタンスに 競合するプロパティー設定が含まれている可能性があることに注意してください。 プロパティー設定は、 クラス・ローダーが jndi.properties ファイルを選出する順序によって決定されます。 クラス・ローダーがクラスパスにファイルを配置する際に使用する順序を制御する方法はありません。 WebSphere Application Server には、 com.ibm.websphere.naming.hostname.normalizer プロパティーを設定する jndi.properties ファイルが最初から含まれていたり、作成されたりすることはありません。

    • Java プログラムで PROPS.HOSTNAME_NORMALIZER* Java 定数を使用することができます。 これらの Java 定数は、com.ibm.websphere.naming.PROPS ファイルで定義されています。 以下に、この方法を使用する場合に指定する定数定義を示します。
      public static final String HOSTNAME_NORMALIZER =
          "com.ibm.websphere.naming.hostname.normalizer";
      public static final String HOSTNAME_NORMALIZER_NONE = "...none...;

      これらの定義 を Java プログラムで使用するには、hashtable にプロパティー設定を追加し、 それを InitialContext コンストラクターに渡します。

      java.util.Hashtable env = new java.util.Hashtable();
      ...
      env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE);
          // Disable hostname normalization
      ...
      javax.naming.Context initialContext = 
         new javax.naming.InitialContext(env);

    例: ホスト名の正規化の無効化

    システム・プロパティー・ファイル、または jndi.properties ファイルでは、 InitialContext コンストラクター・パラメーターを介して、InitialContext コンストラクターに ホスト名正規化プログラム・プロパティーを渡すことができます。 初期コンテキストおよびそのコンテキストから将来検索されるコンテキストは、 このプロパティー設定を使用します。

    以下の例は、ホスト名の正規化を無効にする方法を示しています。

    ...
    import java.util.Hashtable;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import com.ibm.websphere.naming.PROPS; // WebSphere naming constants
    ...
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
          "com.ibm.websphere.naming.WsnInitialContextFactory");
    env.put(Context.PROVIDER_URL, ...);
    env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE);
    Context initialContext = new InitialContext(env);
    java.lang.Object o = initialContext.lookup(...);
    ...