15

我有以下...

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 的一个端口项目

4

3 回答 3

16

好吧,这个问题已经很老了,我看到还没有公认的答案,所以。

这是真正发生的事情:

  1. 您的代码执行 JNDI 查找到java:comp/env/DB2_DB.
  2. WebSphere 使用 WAS 专有的部署描述符 ( ibm-web-bnd.xml) 将应用程序绑定“翻译”DB2_DB成 WebSphere JNDI 树 ( jdbc/DB2DB) 中的真实名称。
  3. WebSphere 查找jdbc/DB2DB并将其返回给调用者。

您正在NameNotFoundException一次查找 - 查找java:comp/env/DB2_DB. 问题不在于找到jdbc/DB2DB;它是DB2_DB在你的组件环境中找到的。

您的部署描述符对我来说看起来不错,所以我猜您的问题的原因是这样的:

Context aContext = new InitialContext(settings);

您正在InitialContext通过提供一个Hashtable. 当Hashtable您需要为构造提供特殊参数时,通常很有用,但您必须知道何时使用它以及何时避免使用它。在 JavaEE 容器中运行并且需要对容器的 JNDI 树进行简单访问的代码很少(如果有的话)应该向构造函数提供任何Hashtable内容InitialContext

例如,如果settings您传入的那些包含指示在某个遥远的外部 JNDI 树上进行查找的键,我不会感到惊讶。InitialContextPROVIDER_URL

因此,我将从废弃该参数开始:

Context aContext = new InitialContext();

然后再试一次。

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

于 2014-05-18T23:03:03.330 回答
0

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

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

aContext.lookup("jdbc/DB2DB");

我假设数据源在数据源配置中被命名为“jdbc/DB2DB”。

否则,您应该检查数据源是否已映射到您的应用程序中。我猜想 ibm-web-bnd.xml 应该在正确设置时进行该映射。

于 2013-04-11T17:41:36.710 回答
0

转储命名空间并在您要查找的目标下找到 jndi。如果未找到,请将 corbaloc URL 更新为目标中给定的 URL。因为查找在我的本地工作,但不在集群环境中工作。我转储了命名空间并确定了 corbaloc URL。然后在 SIT 环境中使用该 corbaloc URL。

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

这解决了我的问题。

于 2018-12-06T03:10:06.093 回答