Tomcat vs Weblogic JNDI Lookup
我们使用的Weblogic服务器已配置为允许JNDI数据源名称,如“appds”。
对于开发(localhost),我们可能正在运行Tomcat,并且当在server.xml的部分中声明时,Tomcat将在JNDI树中的“java:comp / env / jdbc / *”上挂起JNDI数据源。
问题:在Weblogic中,JNDI查找是“appds”,而在Tomcat中,似乎我必须提供正式的“java:comp / env / jdbc / appds”。 我担心Tomcat版本是一个隐含的标准,但不幸的是,我无法更改Weblogic的配置…所以这意味着我们最终会得到两个不同的spring配置文件(我们使用的是spring 2.5)来促进不同的环境。
有没有一种优雅的方式来解决这个问题。 我可以直接在Tomcat中查看JNDI名称吗? spring可以在这两个地方取名吗? 谷歌搜索或建议会很棒。
JndiLocatorSupport
有一个属性resourceRef
。 设置为true时,“java:comp / env /”前缀将自动添加前缀。 因此,我认为从Tomcat迁移到Weblogic时区分此参数是正确的。
如何在Web应用程序中使用单个JNDI名称
我自己几个月来一直在努力。 最好的解决方案是使您的应用程序可移植,以便在Tomcat和Weblogic中具有相同的JNDI名称。
为此,您将web.xml
和spring-beans.xml
更改为指向单个jndi名称,并提供每个供应商特定的jndi名称的映射。
我把每个文件放在下面。
你需要:
- web.xml中的
条目,供您的应用使用单个名称 - 一个文件
WEB-INF/weblogic.xml
用于将您的jndi名称映射到WebLogic管理的资源 -
META-INF/context.xml
文件,用于将jndi名称映射到Tomcat管理的资源- 这可以在Tomcat安装中,也可以在您的应用中。
作为一般规则,喜欢在您的应用程序中使用jdbc/MyDataSource
名称,如jdbc/MyDataSource
和jms/ConnFactory
并避免使用java:comp/env/
前缀。
此外,数据源和连接工厂最好由容器管理并与JNDI一起使用。 在应用程序中实例化数据库连接池是一个常见错误 。
弹簧
web.xml中
My data source jdbc/appds javax.sql.DataSource Container
weblogic.xml中
appds jdbc/appds
META-INF / context.xml (用于Tomcat)
我使用Spring管理Tomcat和WebLogic的技巧。 以下是对我如何运作的描述。
以下配置适用于Tomcat和Weblogic。
在spring:
在Weblogic Admin Console中,创建名为jdbc/AgriShare
的JDBC资源。 在“目标”下,请确保您将服务器转移到您正在部署应用程序的服务器上! 。 这一点特别让我花了一些时间……
环境变量怎么样? 使用Weblogic名称为开发人员计算机设置tomcat名称和生产。 您甚至可以将代码设置为使用默认代码(WebLogic),以防该变量不存在。
你是如何在spring引用资源的?
这就是我们对tomcat的看法:
背景:
弹簧:
jee命名空间来自:
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
在应用程序本身中设置DataSource并不是那么疯狂:)我想如果应用程序要部署在网格上,甚至是强制性的。 河流,GigaSpaces或类似。
注意:我没有说连接设置必须在WAR内部进行硬编码,它们需要在部署时/运行时提供。 这简化了云实例的管理,因为只能配置。
只有在那里部署多个应用程序并且他们可以使用共享资源时,才能在容器上配置资源。
同样,在云类型的部署中,每个servlet容器实例只有一个应用程序。
我的应用程序也有类似的问题,这就是我解决它的方式:
1) WEB-INF/classes/application.properties
包含以下条目:
ds.jndi =的java:comp / env的/ JDBC / tCDS的
2)在WLS机器上,我在/etc/sysenv
文件中有一个条目:
ds.jndi = wlsds
3)我使用PropertyPlaceholderConfigurer
bean将classpath:application.properties
和file:/etc/sysenv
作为位置,配置spring以查找属性${ds.jndi}
的JNDI。 我还将ignoreResourceNotFound
设置为true
这样开发人员就不需要在他们的机器上安装/etc/sysenv
。
4)我使用Cargo + Jetty进行集成测试,我无法在那里正确设置JNDI环境。 所以我也使用JndiObjectFactoryBean
的defaultObject
属性配置了后备JndiObjectFactoryBean
。