レガシーアプリケーションをWebLogic 11gにデプロイしました。アプリケーションには次のコードがあります。
Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("Java:myDataSource");
また、次のJNDI名でWebLogicに構成されたデータソースがあります。
jdbc/myDataSource
上記のJavaコードが実行されると、次の例外が発生します。
javax.naming.NameNotFoundException: While trying to look up /myDataSource in /app/webapp/axis2.war/60105275.; remaining name '/myDataSource'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.Java:1139)
at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.Java:144)
私はJNDIにかなり慣れていないので、私の質問は?ネーミングの切断はどこにありますか?コンテキストルックアップのプレフィックスに「Java:」が付いているとはどういう意味ですか?
ありがとう!
あなたはこれを簡単に行うことができるはずです:
Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");
リモートの宛先から検索する場合は、次のようなWL初期コンテキストファクトリを使用する必要があります。
Hashtable<String, String> h = new Hashtable<String, String>(7);
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, pURL); //For example "t3://127.0.0.1:7001"
h.put(Context.SECURITY_PRINCIPAL, pUsername);
h.put(Context.SECURITY_CREDENTIALS, pPassword);
InitialContext context = new InitialContext(h);
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");
Java
は、リソースのルートJNDI名前空間です。元のコードスニペットの意味は、アプリケーションが最初にデプロイされたコンテナが、取得したJNDIコンテキストに追加の名前空間を適用しなかったことです(例として、Tomcatはすべてのリソースを名前空間_comp/env
_に自動的に追加するため、リソース参照名が_jdbc/myDataSource
_)の場合、dataSource = (javax.sql.DataSource) context.lookup("Java:comp/env/jdbc/myDataSource");
を実行する必要があります。
レガシーコードを変更する必要がないようにするには、myDataSource
という名前でデータソースを登録する場合(_jdbc/
_を削除する)なら問題ないと思います。うまくいくかどうか教えてください。
ハードコードされたJDBC文字列の代わりにデータソースを使用するために、レガシーWeblogic 8アプリを更新する必要がありました。 Weblogic管理者の[構成]タブにあるデータソースJNDI名は、「weblogic.jdbc.ESdatasource」を示し、以下の2つの方法で機能しました。
Context ctx = new InitialContext();
DataSource dataSource;
try {
dataSource = (DataSource) ctx.lookup("weblogic.jdbc.ESdatasource");
response.getWriter().println("A " +dataSource);
}catch(Exception e) {
response.getWriter().println("A " + e.getMessage() + e.getCause());
}
//or
try {
dataSource = (DataSource) ctx.lookup("weblogic/jdbc/ESdatasource");
response.getWriter().println("F "+dataSource);
}catch(Exception e) {
response.getWriter().println("F " + e.getMessage() + e.getCause());
}
//use your datasource
conn = datasource.getConnection();
それはすべての人々です。 Weblogicアプリの内部からパスワードや初期コンテキストファクトリは必要ありません。
これと同じような問題がありました。 Java:comp/env/
プレフィックスを削除し、コンテキストルックアップでjdbc/myDataSource
を使用することで解決しました。誰かがコメントで指摘したように。