web-dev-qa-db-ja.com

WebSphere:JNDIコンテキスト検索の失敗

私は次のものを持っています...

Context aContext = = new InitialContext(settings);
aContext.lookup("Java:comp/env/DB2_DB");

また試してみました...

aContext.lookup("DB2_DB");

web.xml

<resource-ref>
    <description>
    </description>
    <res-ref-name>DB2_DB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Application</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    <mapped-name>DB2_DB</mapped-name>
</resource-ref>

その後、私のibm-web-bnd.xmlで...

<resource-ref name="DB2_DB" binding-name="jdbc/DB2DB" />

Websphereでは、resources> JDBC> Data Sourcesにバインディング名が表示されます

しかし、アプリケーションを実行すると...

原因:javax.naming.NameNotFoundException:コンテキスト:Node04Cell/nodes/Node04/servers/server1、名前:DB2_DB:名前DB2_DBの最初のコンポーネントが見つかりません。 [ルート例外はorg.omg.CosNaming.NamingContextPackage.NotFound:IDL:omg.org/CosNaming/NamingContext/NotFound:1.0] ^ M

これはWAS6-8.5からの移植プロジェクトです

13
Jackie

さて、この質問は非常に古いものであり、まだ受け入れられた答えがないことがわかりました。

実際に起こることは次のとおりです。

  1. コードは、Java:comp/env/DB2_DBへのJNDIルックアップを実行します。
  2. WebSphereはWAS固有のデプロイメント記述子(ibm-web-bnd.xml)を使用して、アプリケーションバインディングDB2_DBをWebSphere JNDIツリーの実名(jdbc/DB2DB)に「変換」します。
  3. WebSphereはjdbc/DB2DBを検索し、呼び出し元に返します。

firstルックアップ-Java:comp/env/DB2_DBのルックアップでNameNotFoundExceptionを取得しています。問題はjdbc/DB2DB;を見つけることではありません。それは、コンポーネントの環境内でDB2_DBを見つけることです。

あなたのデプロイメント記述子は私には問題ないように見えるので、問題の理由はこれだと推測しています:

Context aContext = new InitialContext(settings);

InitialContextを提供することにより、Hashtableインスタンスを構築しています。 Hashtableは、構築のために特別なパラメーターを提供する必要がある場合に役立ちますが、それをいつ使用し、いつ回避するかを知っておく必要があります。 JavaEEコンテナー内で実行され、コンテナーのJNDIツリーrarelyへの簡単なアクセスを必要とするコードは、もしあれば、HashtableInitialContextコンストラクター。

settingsに渡すInitialContextに、たとえば、遠い外部のJNDIツリーでルックアップを行うように指示するPROVIDER_URLキーが含まれていても驚かないでしょう。

だから、私はそのパラメータを廃棄することから始めます:

Context aContext = new InitialContext();

そして、別のショットを与えます。

それでも失敗する場合は、WebSphereのdumpNamespaceユーティリティを使用して、WebSphereのJNDIツリーを明確に把握してください。

14
Isaac

名前空間をダンプし、検索するターゲットの下のjndiを見つけます。見つからない場合は、corbaloc URLをターゲットで指定されているURLに更新します。ルックアップはローカルで機能していましたが、クラスター環境では機能していなかったためです。名前空間をダンプし、corbaloc URLを特定しました。次に、SIT環境でそのcorbaloc URLを使用しました。

例:JMS_Hostはローカルではcorbaloc :: localhost:2809/NameServiceServerRootでしたが、クラスター環境ではJMS_Host = corbaloc :: ABC-DEF-XYZ:9810/NameServiceServerRootでした

これで問題が解決しました。

0
Kuppusamy

Ibm-web-bnd.xmlが何をするのかわかりませんが、2つのことを試すことができます。

まず、グローバルルックアップを実行してみてください。試してください:

aContext.lookup("jdbc/DB2DB");

データソースの名前が「jdbc/DB2DB」で、データソースの構成が含まれていると仮定します。

それ以外の場合は、アプリケーションで datasourceがマップされている かどうかを確認する必要があります。 ibm-web-bnd.xmlは、適切にセットアップされたときにそのマッピングを実行するはずです。

0
Udo Held