在Tomcat 6上部署两个或多个应用程序时,我在使用JNDI时遇到问题。
请考虑以下情形:
我有2个webapp,其中每个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><env-entry-name>testEntry</env-entry-name><env-entry-value>value B</env-entry-value><env-entry-type>java.lang.String</env-entry-type></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代码来查找它们:Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
String value = (String)envCtx.lookup("testEntry");

任何帮助都将受到欢迎,因为关于JNDI的好的文档很伤人。

最佳答案

顺便提一句,

  • 您不需要web.xml中的内容。
  • 您不需要修改/tomcat6/conf/context.xml

  • 您所需要做的就是将context.xml放入war中的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"/>
    

    10-05 18:21
    查看更多