java使用另一个应用程序通过Tomcat创建的JNDI数据源
我有一本书。我的应用程序中包含数据源属性的属性文件。 我使用以下代码设置了对该数据源的JNDI引用:
// first I create MyDataSource from the properties found in the .properties file
//then :
Context initContext = new InitialContext();
initContext.createSubcontext("jdbc");
initContext.createSubcontext("jdbc/oracle");
initContext.rebind(jdbc/oracle/myDataSource, MyDataSource);
如果在此应用程序中使用查找,则会找到数据源:
Context initContext = new InitialContext();
BasicDataSource dataSource =
(BasicDataSource) initContext.lookup("jdbc/oracle/myDataSource")
//everything works fine and I can use my dataSource to getConnection,
//requests, etc...
现在我想在另一个应用程序中使用这个数据源。但是,如果我执行与以前相同的查找,我就找不到myDataSource(而tomcat中仍然有以前的应用程序,jndi绑定是在侦听器的帮助下在启动时完成的)
考虑到我不能在服务器中使用Tomcat的资源,我如何在第二个应用程序中获取myDataSource。xml或上下文。xml文件(出于不同的原因,我必须使用这个.properties文件)
谢谢
# 1 楼答案
在Tomcat中,“本地”JDNI目录是只读的。不过,您可以在LifecycleListener中绑定“全局”JNDI资源,然后将它们“链接”到您的上下文(*):
你需要实现org。阿帕奇。卡塔琳娜。生命周期监听器http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/LifecycleListener.html
然后在你的服务器上注册。类似这样的xml(以及其他侦听器):
你的听众应该等待两个事件:
然后,您必须在META-INF/context中使用ResourceLink元素将资源访问从“全局”JNDI目录“链接”到“本地”JNDI目录,从而传播资源访问。xml:
到目前为止,这对我很有效
(*)一些注意事项:
使用生命周期侦听器有一个优势。因为无法保证上下文创建的顺序。这样做的好处是,您的所有上下文都会看到这个对象被创建
如果需要比创建生命周期侦听器时更动态地创建和配置数据源,请注意,可以绑定实现工厂模式的自定义类
<>为了避免类加载不兼容问题,考虑将侦听器、数据源等类放入Tomcat LIB目录中的JAR文件中,这样它们就包含在公共类加载器中。问候
# 2 楼答案
你想做的事是行不通的。不允许J2EE应用程序修改应用服务器提供的JNDI环境(J2EE规范,第5.2.2节),并且Tomcat JNDI documentation还声明,每个web应用程序都有自己的只读JNDI环境。我不确定为什么绑定/重新绑定数据源不会立即失败,为什么它在同一个web应用程序中工作,但即使是这样的应用程序内部使用JNDI环境也是未记录的行为,我也不会依赖它
# 3 楼答案
JNDI上下文对每个webapp都是私有的。其他人无法访问在一个应用程序中创建的上下文
尝试在GlobalNamingResources中创建一个条目,并使用
<ResourceLink>
在两个webapp中创建链接,看看它是否有效我以前使用这个设置从两个应用程序中读取数据,但从未尝试从一个应用程序中写入数据。所以我不确定它是否会起作用
# 4 楼答案
一些人已经对此发表了评论,但我认为你的问题的答案是:Tomcat有一个名为server的文件。需要使用的xml。我以前使用过的一个很好的参考资料如下:
http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html
此处定义的资源将对部署的所有应用可见(如果设置正确)。如果在应用程序上下文或web xml文件中设置了JNDI资源,则该资源应仅对应用程序可用
# 5 楼答案
实际上,如果servlet实现org,就可以访问其他JNDI资源。阿帕奇。卡塔琳娜。ContainerServlet。这个界面有一个组织。阿帕奇。卡塔琳娜。包装器属性,该属性由容器本身“填充”
通过这些,我创建了一个简单的应用程序来监控资源
但是,我想在侦听器中这样做,这样我的资源监视器就可以在容器启动时启动。有人知道路吗