我们正在使用的Weblogic服务器已配置为允许JNDI数据源名称,例如" appds"。
对于开发(本地主机),我们可能正在运行Tomcat,并且在server.xml的部分中声明时,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搜索或建议会很棒。
如何在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安装中,也可以在您的应用程序中。
通常,最好在应用程序中使用您的jndi名称,例如jdbc/MyDataSource和jms/ConnFactory,并避免在它们前面加上java:comp/env/。
而且,数据源和连接工厂最好由容器管理,并与JNDI一起使用。在应用程序中实例化数据库连接池是一个常见的错误。
弹簧
1 2 3 4 5 6 7 8 9 10 11
| <?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
1 2 3 4 5 6
| <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
1 2 3 4 5 6 7 8 9 10 11 12
| <?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)
1 2 3
| <Context>
<ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context> |
JndiLocatorSupport具有属性resourceRef。设置为true时,将自动在前面加上" java:comp / env /"前缀。因此,我认为从Tomcat迁移到Weblogic时区分该参数是正确的。
以下配置对我来说可在Tomcat和Weblogic中使用。
在春天:
1 2 3 4 5
| <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的JDBC资源。在"目标"下,确保将数据源定位到您要向其部署应用程序的服务器上。这点我刚才花了一些时间...
我已经使用Spring在Tomcat和WebLogic中解决了这个问题。这是它对我的工作方式的描述。
在应用程序本身中设置DataSource并不是那么疯狂:)我想说,如果打算将应用程序部署在网格上,那甚至是强制性的。河,GigaSpaces或类似地点。
注意:我并不是说连接设置必须在WAR内进行硬编码,它们需要在部署时/运行时提供。由于仅在本地进行配置,因此简化了云实例的管理。
只有在多个容器中部署了多个应用程序并且它们可以使用共享资源的情况下,在容器上配置资源才有意义。
同样,在云类型的部署中,每个Servlet容器实例只有一个应用程序。
您在春季如何引用资源?
这就是tomcat的功能:
上下文:
1 2 3 4
| <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"/> |
弹簧:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <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
环境变量如何?将开发人员机器设置为tomcat名称,将生产机器设置为Weblogic名称。您甚至可以将代码设置为使用默认代码(WebLogic),以防变量不存在。
我的应用程序也有类似的问题,这就是我解决的方法:
1)WEB-INF/classes/application.properties包含条目:
1
| ds.jndi=java:comp/env/jdbc/tcds |
2)在WLS机器上,我在/etc/sysenv文件中有一个条目:
3)我配置了spring以使用PropertyPlaceholderConfigurer bean和classpath:application.properties和file:/etc/sysenv作为位置,通过属性${ds.jndi}查找JNDI。我还将ignoreResourceNotFound设置为true,以便开发人员无需在其计算机上安装/etc/sysenv。
4)我使用Cargo + Jetty进行了集成测试,但无法在此处正确设置JNDI环境。因此,我也使用JndiObjectFactoryBean的defaultObject属性配置了后备BasicDataSource。