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 可以在两个地方都取一个名字并查看吗?谷歌搜索或建议会很棒。
解决方案
JndiLocatorSupport
有财产 resourceRef
. 。当设置为 true 时,“java:comp/env/”前缀将自动添加到前面。所以我相信从 Tomcat 迁移到 Weblogic 时区分这个参数是正确的。
其他提示
如何在 Web 应用程序中使用单个 JNDI 名称
我自己也为此苦苦挣扎了几个月。最好的解决方案是使您的应用程序可移植,以便您在 Tomcat 和 Weblogic 中具有相同的 JNDI 名称。
为了做到这一点,你改变你的 web.xml
和 spring-beans.xml
指向单个 jndi 名称,并提供到每个供应商特定 jndi 名称的映射。
我已将每个文件放在下面。
你需要:
- A
<resource-ref />
web.xml 中的条目让您的应用程序使用单个名称 - 一份文件
WEB-INF/weblogic.xml
将您的 jndi 名称映射到 WebLogic 管理的资源 - 一份文件
META-INF/context.xml
将您的 jndi 名称映射到 Tomcat 管理的资源- 这可以在 Tomcat 安装中或在您的应用程序中。
作为一般规则,更喜欢在应用程序中使用 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>
网络.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 (对于雄猫)
<Context>
<ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>
我已经使用 Spring 管理了 Tomcat 和 WebLogic 的技巧。 这里 是对它如何为我工作的描述。
以下配置适用于我的 Tomcat 和 Weblogic。
在春天:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
<property name="resourceRef" value="true" />
<property name="jndiName" value="jdbc/AgriShare" />
</bean>
在 Weblogic 管理控制台中创建一个名为 jdbc/AgriShare
. 。在“目标”下, 确保将数据源定位到要部署应用程序的服务器!. 。这个特殊的点刚才花了我一些时间......
环境变量怎么样?将开发人员计算机设置为 tomcat 名称,将生产计算机设置为 Weblogic 名称。您甚至可以将代码设置为使用默认代码 (WebLogic),以防变量不存在。
你如何在 spring 中引用资源?
这就是我们为 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
在应用程序本身中设置数据源并不是那么疯狂:)我想说,如果应用程序要部署在网格上,那么这甚至是强制性的。River、GigaSpaces 或类似的。
笔记:我并不是说连接设置必须在 WAR 内部进行硬编码,它们需要在部署时/运行时提供。这简化了云实例的管理,因为只需进行配置。
仅当多个应用程序部署在容器中并且它们可以使用共享资源时,在容器中配置资源才有意义。
同样,在云类型的部署中,每个 servlet 容器实例只有一个应用程序。
我的应用程序也有类似的问题,这就是我解决它的方法:
1) WEB-INF/classes/application.properties
包含条目:
ds.jndi=java:comp/env/jdbc/tcds
2)在WLS机器上,我有一个条目 /etc/sysenv
文件:
ds.jndi=wlsds
3)我配置spring来查找JNDI vis属性 ${ds.jndi}
, , 用一个 PropertyPlaceholderConfigurer
豆与 classpath:application.properties
和 file:/etc/sysenv
作为地点。我还设置了 ignoreResourceNotFound
到 true
这样开发人员就不需要 /etc/sysenv
在他们的机器上。
4) 我使用 Cargo+Jetty 运行集成测试,但无法在那里正确设置 JNDI 环境。所以我有一个后备方案 BasicDataSource
也使用配置 defaultObject
的财产 JndiObjectFactoryBean
.