在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"/>