web-dev-qa-db-ja.com

WebLogicでJNDIリソースを検索する方法は?

レガシーアプリケーションを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:」が付いているとはどういう意味ですか?

ありがとう!

9
wsb3383

あなたはこれを簡単に行うことができるはずです:

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");

weblogic.jndi.WLInitialContextFactory

8
Jeff West

Javaは、リソースのルートJNDI名前空間です。元のコードスニペットの意味は、アプリケーションが最初にデプロイされたコンテナが、取得したJNDIコンテキストに追加の名前空間を適用しなかったことです(例として、Tomcatはすべてのリソースを名前空間_comp/env_に自動的に追加するため、リソース参照名が_jdbc/myDataSource_)の場合、dataSource = (javax.sql.DataSource) context.lookup("Java:comp/env/jdbc/myDataSource");を実行する必要があります。

レガシーコードを変更する必要がないようにするには、myDataSourceという名前でデータソースを登録する場合(_jdbc/_を削除する)なら問題ないと思います。うまくいくかどうか教えてください。

6
Femi

ハードコードされた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アプリの内部からパスワードや初期コンテキストファクトリは必要ありません。

1
wholenewstrain

これと同じような問題がありました。 Java:comp/env/プレフィックスを削除し、コンテキストルックアップでjdbc/myDataSourceを使用することで解決しました。誰かがコメントで指摘したように。

1