tomcat 6中特定于上下文的JNDI参数问题

时间:2010-11-11 09:26:16

标签: tomcat jndi

在Tomcat 6上部署两个或更多应用程序时,我无法使用JNDI。 请考虑以下情形: 我有2个webapps,其中每个web.xml包含一个JNDI参数。

web.xml webapp A:

<env-entry>
<env-entry-name>testEntry</env-entry-name>
<env-entry-value>value A</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>

web.xml webapp B:
<env-entry>

当我部署两个webapp并查找testEntry的值时,两个 webapps返回值A.似乎只有第一个加载的web.xml中的JNDI参数可用。 根据我对JNDI的理解,每个web.xml都包含webapp特定的JNDI值,这些值仅在各自的上下文中可用。我在做什么/想错了什么?

这导致了我的下一个问题。如何定义所有上下文中可用的全局JNDI参数?在tomcat文档中,我读过你应该使用{CATALINA_HOME} /conf/context.xml来达到这个目的。但环境条目在上下文中不可用。将它们放在{CATALINA_HOME} /conf/web.xml中可以使它们全局可访问,但我怀疑这是正确的方法。

这是我查找它们的Java代码:

<env-entry-name>testEntry</env-entry-name>

欢迎任何帮助,因为关于JNDI的良好文档是伤痕。

4 个答案:

答案 0 :(得分:3)

顺便说一句,

  1. 你不需要web.xml中的东西。
  2. 您无需修改​​/tomcat6/conf/context.xml
  3. 您只需将context.xml放在warCon中的WebContent目录的META-INF中。 JNDI将自动注册,并且将在应用程序加载时创建池。

    只有可选,您可以将其放在/tomcat6/conf/context.xml中,但这需要在每次配置更改后重新启动tomcat。

    这是我的sql的一些很好的配置。重要的一点是logAbandoned(用于检测由容器抛出池的未关闭连接,因为您的代码忘记关闭它)。对于验证查询,我建议测试数据库表的存在。

    <Resource name="jdbc/NAME" auth="Container" type="javax.sql.DataSource"
                   maxActive="100" minIdle="10" maxWait="10000" removeAbandoned="true"
                   removeAbandonedTimeout="60" logAbandoned="true"
                   testWhileIdle="true" testOnBorrow="true" testOnReturn="false"
                   timeBetweenEvictionRunsMillis="5000"
                   validationQuery="SELECT 1" initialSize="10"
                   username="usrname" password="password"   
                   driverClassName="com.mysql.jdbc.Driver"
                   url="jdbc:mysql://localhost:3306/databb?autoReconnect=true"/>
    

答案 1 :(得分:2)

好吧,我再次重访JNDI领域并遇到了类似的用例。现在我成功了。

如果需要在Web应用程序中访问纯JNDI变量,则应在Web应用程序的元素中定义它们。但是在上下文中定义环境条目的语法与Web应用程序描述符中使用的语法不同(请参阅我的原始帖子)。这就是我的困惑开始的地方。

在上下文中它应该是:

对于全局变量,我仍然认为{CATALINA_HOME} /conf/context.xml将是放置这些环境条目的地方。

请参阅apache上的文档: http://tomcat.apache.org/tomcat-5.5-doc/config/context.html#Environment_Entries

无论如何,谢谢你的帮助!

答案 2 :(得分:0)

我最近在网上搜索JNDI的东西,也是这个话题的新手。我认为这个link (ResourceLink标签是这里的关键字)就是你要找的东西。 干杯!

答案 3 :(得分:0)

从您给出的示例中,我认为“值A”应仅为(应用于)webapp A定义,反之亦然。

实现的一种方法是在每个webapp的META-INF / context.xml文件中将它们定义为上下文参数(而不是JNDI资源),如here所述。如果这样做,您可以确保每个参数只能通过自己的webapp访问。