Tomcat与Weblogic JNDI查找
我们正在使用的Weblogic服务器已配置为允许JNDI数据源名称,例如" appds"。
对于开发(本地主机),我们可能正在运行Tomcat,并且在server.xml的<context>部分中声明时,Tomcat会将JNDI数据源挂在JNDI树中的" java:comp / env / jdbc / *"上。
问题:在Weblogic中,JNDI查找是" appds",而在Tomcat中,看来我必须提供正式的" java:comp / env / jdbc / appds"。恐怕Tomcat版本是一个隐式标准,但是不幸的是,我无法更改Weblogic的配置...,这意味着我们最终只能使用两个不同的spring配置文件(我们使用的是spring 2.5)来适应不同的环境。
有没有一种优雅的方式来解决这个问题。我可以直接在Tomcat中查找JNDI名称吗? Spring可以在两个地方取一个名字和外观吗? Google搜索或者建议会很棒。
解决方案
回答
环境变量如何?将开发人员机器设置为tomcat名称,将生产机器设置为Weblogic名称。我们甚至可以将代码设置为使用默认代码(WebLogic),以防变量不存在。
回答
我的应用程序也有类似的问题,这就是我解决的方法:
1)WEB-INF / classes / application.properties包含以下条目:
ds.jndi=java:comp/env/jdbc/tcds
2)在WLS机器上,我在/ etc / sysenv
文件中有一个条目:
ds.jndi=wlsds
3)我配置了spring,以使用PropertyPlaceholderConfigurer bean和classpath:application.properties和file:/ etc / sysenv作为位置,通过属性$$ {ds.jndi}查找JNDI。我还将" ignoreResourceNotFound"设置为" true",以便开发人员无需在其计算机上安装" / etc / sysenv"。
4)我使用Cargo + Jetty进行了集成测试,但无法在那里正确设置JNDI环境。所以我也使用JndiObjectFactoryBean的defaultObject属性配置了一个备用BasicDataSource。
回答
JndiLocatorSupport具有属性resourceReference。设置为true时,将自动在前面加上" java:comp / env /"前缀。因此,我认为从Tomcat迁移到Weblogic时区分该参数是正确的。
回答
我们在春季如何引用资源?
这就是tomcat的功能:
语境:
<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description=" JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc tiveMQBroker"/>
春天:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true" expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>
jee命名空间来自:
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
回答
我已经使用Spring在Tomcat和WebLogic中解决了这个问题。这是它对我的工作方式的描述。
回答
如何在Web应用程序中使用单个JNDI名称
我本人为此已经挣扎了几个月。最好的解决方案是使应用程序具有可移植性,以便在Tomcat和Weblogic中具有相同的JNDI名称。
为了做到这一点,我们可以将" web.xml"和" spring-beans.xml"更改为指向单个jndi名称,并提供到每个供应商特定的jndi名称的映射。
我已将每个文件放在下面。
你需要:
- web.xml中的
<resource-ref />
条目,供应用使用单个名称 - 文件" WEB-INF / weblogic.xml",用于将jndi名称映射到WebLogic管理的资源
通常,最好在应用中使用jndi名称,例如" jdbc / MyDataSource"和" jms / ConnFactory",并避免在其前加上" java:comp / env /"前缀。
而且,数据源和连接工厂最好由容器管理,并与JNDI一起使用。在应用程序中实例化数据库连接池是一个常见的错误。
春天
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> <jee:jndi-lookup jndi-name="jdbc/appds" id="dataSource" /> </beans>
web.xml
<resource-ref> <description>My data source</description> <res-ref-name>jdbc/appds</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
weblogic.xml
<?xml version="1.0" encoding="UTF-8" ?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd"> <resource-description> <jndi-name>appds</jndi-name> <res-ref-name>jdbc/appds</res-ref-name> </resource-description> </weblogic-web-app>
META-INF / context.xml(对于Tomcat)
<Context> <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/> </Context>