私は次のものを持っています...
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からの移植プロジェクトです
さて、この質問は非常に古いものであり、まだ受け入れられた答えがないことがわかりました。
実際に起こることは次のとおりです。
Java:comp/env/DB2_DB
へのJNDIルックアップを実行します。ibm-web-bnd.xml
)を使用して、アプリケーションバインディングDB2_DB
をWebSphere JNDIツリーの実名(jdbc/DB2DB
)に「変換」します。jdbc/DB2DB
を検索し、呼び出し元に返します。firstルックアップ-Java:comp/env/DB2_DB
のルックアップでNameNotFoundException
を取得しています。問題はjdbc/DB2DB
;を見つけることではありません。それは、コンポーネントの環境内でDB2_DB
を見つけることです。
あなたのデプロイメント記述子は私には問題ないように見えるので、問題の理由はこれだと推測しています:
Context aContext = new InitialContext(settings);
InitialContext
を提供することにより、Hashtable
インスタンスを構築しています。 Hashtable
は、構築のために特別なパラメーターを提供する必要がある場合に役立ちますが、それをいつ使用し、いつ回避するかを知っておく必要があります。 JavaEEコンテナー内で実行され、コンテナーのJNDIツリーrarelyへの簡単なアクセスを必要とするコードは、もしあれば、Hashtable
をInitialContext
コンストラクター。
settings
に渡すInitialContext
に、たとえば、遠い外部のJNDIツリーでルックアップを行うように指示するPROVIDER_URL
キーが含まれていても驚かないでしょう。
だから、私はそのパラメータを廃棄することから始めます:
Context aContext = new InitialContext();
そして、別のショットを与えます。
それでも失敗する場合は、WebSphereのdumpNamespace
ユーティリティを使用して、WebSphereのJNDIツリーを明確に把握してください。
名前空間をダンプし、検索するターゲットの下のjndiを見つけます。見つからない場合は、corbaloc URLをターゲットで指定されているURLに更新します。ルックアップはローカルで機能していましたが、クラスター環境では機能していなかったためです。名前空間をダンプし、corbaloc URLを特定しました。次に、SIT環境でそのcorbaloc URLを使用しました。
例:JMS_Hostはローカルではcorbaloc :: localhost:2809/NameServiceServerRootでしたが、クラスター環境ではJMS_Host = corbaloc :: ABC-DEF-XYZ:9810/NameServiceServerRootでした
これで問題が解決しました。
Ibm-web-bnd.xmlが何をするのかわかりませんが、2つのことを試すことができます。
まず、グローバルルックアップを実行してみてください。試してください:
aContext.lookup("jdbc/DB2DB");
データソースの名前が「jdbc/DB2DB」で、データソースの構成が含まれていると仮定します。
それ以外の場合は、アプリケーションで datasourceがマップされている かどうかを確認する必要があります。 ibm-web-bnd.xmlは、適切にセットアップされたときにそのマッピングを実行するはずです。