WebSphere:JNDI上下文查找失败

时间:2013-04-11 15:48:51

标签: websphere

我有以下......

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中,我在资源&gt; JDBC&gt; Data Sources

中看到了绑定名称

但是当我运行我的应用程序时,我看到......

  

引起:javax.naming.NameNotFoundException:上下文:Node04Cell / nodes / Node04 / servers / server1,name:DB2_DB:找不到名称DB2_DB中的第一个组件。 [root例外是org.omg.CosNaming.NamingContextPackage.NotFound:IDL:omg.org/CosNaming/NamingContext/NotFound:1.0] ^ M

这是WAS6-8.5的端口项目

3 个答案:

答案 0 :(得分:14)

嗯,这个问题很老了,我发现还没有接受答案,所以。

以下是真实情况:

  1. 您的代码执行到java:comp/env/DB2_DB的JNDI查找。
  2. WebSphere使用WAS专有的部署描述符(ibm-web-bnd.xml)来&#34;翻译&#34;应用程序将DB2_DB绑定到WebSphere JNDI树(jdbc/DB2DB)中的实名。
  3. WebSphere查找jdbc/DB2DB并将其返回给调用者。
  4. 您在第一次查询中获得了NameNotFoundException - java:comp/env/DB2_DB的查找。问题不在于找到jdbc/DB2DB;它在您的组件环境中找到DB2_DB

    您的部署描述符对我来说没问题,因此我猜测您的问题的原因是:

    Context aContext = new InitialContext(settings);
    

    您正在通过提供InitialContext来构建Hashtable实例。当您需要为构造提供特殊参数时,Hashtable通常很有用,但您必须知道何时使用它以及何时避免。在JavaEE容器内运行且需要对容器的简单访问的代码很少,如果有的话,应该向Hashtable构造函数提供任何InitialContext。< / p>

    如果您settings传递给InitialContext的那些PROVIDER_URL包含一个Context aContext = new InitialContext(); 键,指示查找在某些内容上发生,我不会感到惊讶遥远的外国JNDI树。

    所以,我将从废弃该参数开始:

    dumpNamespace

    然后再拍一次。

    如果仍然失败,请使用WebSphere的{{1}}实用程序来清楚地了解WebSphere的JNDI树。

答案 1 :(得分:0)

我不确定ibm-web-bnd.xml是做什么的,但你可以尝试两件事。

首先,您可以尝试进行全局查找。尝试:

aContext.lookup("jdbc/DB2DB");

我假设数据源名为“jdbc / DB2DB”,并带有数据源配置。

否则,您应该检查应用程序中的datasource is mapped。我想ibm-web-bnd.xml应该在正确设置时进行映射。

答案 2 :(得分:0)

转储名称空间,并在要查找的目标下找到jndi。如果找不到,请将corbaloc URL更新为目标中指定的URL。因为查找是在我的本地环境中进行的,但在群集环境中却没有进行。我转储了名称空间并标识了corbaloc URL。然后在SIT环境中使用该corbaloc URL。

示例:JMS_HOST在本地为corbaloc :: localhost:2809 / NameServiceServerRoot,但在集群环境中为JMS_HOST = corbaloc :: ABC-DEF-XYZ:9810 / NameServiceServerRoot

这解决了我的问题。