在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的良好文档是伤痕。
答案 0 :(得分: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访问。