Tomcat vs Weblogic JNDI Lookup

时间:2008-09-06 17:13:14

标签: java tomcat java-ee weblogic jndi

我们使用的Weblogic服务器已配置为允许JNDI数据源名称,如“appds”。

对于开发(localhost),我们可能正在运行Tomcat,并且在< context>中声明时在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可以在两个地方都有名字和外观吗?谷歌搜索或建议会很棒。

8 个答案:

答案 0 :(得分:19)

如何在网络应用中使用单个JNDI名称

我自己几个月来一直在努力。最好的解决方案是使您的应用程序可移植,以便在Tomcat和Weblogic中具有相同的JNDI名称。

为此,您可以将web.xmlspring-beans.xml更改为指向单个jndi名称,并提供每个供应商特定的jndi名称的映射。

我已将每个文件放在下面。

你需要:

  • web.xml中的<resource-ref />条目,供您的应用使用单个名称
  • 将您的jndi名称映射到WebLogic管理的资源
  • 的文件WEB-INF/weblogic.xml
  • 将jndi名称映射到Tomcat管理的资源的文件META-INF/context.xml
    • 可以在Tomcat安装中,也可以在您的应用中使用。

作为一般规则,您希望在您的应用中使用jdbc/MyDataSourcejms/ConnFactory作为jndi名称,并避免使用java:comp/env/为其添加前缀。

此外,数据源和连接工厂最好由容器管理并与JNDI一起使用。这是一个common mistake to instantiate database connection pools in your application

弹簧

<?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>

答案 1 :(得分:11)

JndiLocatorSupport有一个属性resourceRef。设置为true时,“java:comp / env /”前缀将自动添加前缀。因此,我认为从Tomcat迁移到Weblogic时区分此参数是正确的。

答案 2 :(得分:2)

我使用Spring管理Tomcat和WebLogic的技巧。 Here描述了它对我有用。

答案 3 :(得分:2)

以下配置适用于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 Admin Console中,创建名为jdbc/AgriShare的JDBC资源。在“目标”下,请确保您将服务器的目标转移到您正在部署的应用程序上!。这一点特别让我花了一些时间......

答案 4 :(得分:1)

环境变量怎么样?使用Weblogic名称为开发人员计算机设置tomcat名称和生产。您甚至可以将代码设置为使用默认代码(WebLogic),以防该变量不存在。

答案 5 :(得分:1)

您如何在春季引用该资源?

这就是我们对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

答案 6 :(得分:1)

在应用程序本身设置DataSource并不是那么疯狂:)我想说如果应用程序要部署在网格上,这甚至是强制性的。河流,GigaSpaces或类似的。

注意:我没有说连接设置必须在WAR内部进行硬编码,它们需要在部署时/运行时提供。这简化了云实例的管理,因为只有在配置的位置。

只有在那里部署多个应用程序并且他们可以使用共享资源时,才能在容器上配置资源。

同样,在云类型的部署中,每个servlet容器实例只有一个应用程序。

答案 7 :(得分:0)

我的应用程序也有类似的问题,这就是我解决它的方法:

1)WEB-INF/classes/application.properties包含条目:

ds.jndi=java:comp/env/jdbc/tcds

2)在WLS机器上,我在/etc/sysenv文件中有一个条目:

ds.jndi=wlsds

3)我使用${ds.jndi} bean作为位置,使用PropertyPlaceholderConfigurer bean配置spring以查找属性classpath:application.properties的JNDI。我还将file:/etc/sysenv设置为ignoreResourceNotFound,以便开发人员无需在其计算机上使用true

4)我使用Cargo + Jetty进行集成测试,我无法在那里正确设置JNDI环境。因此,我使用/etc/sysenv的{​​{1}}属性配置了后备BasicDataSource