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.xmlspring-beans.xml更改为指向单个jndi名称,并提供每个供应商特定的jndi名称的映射。

我把每个文件放在下面。

你需要:

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

作为一般规则,喜欢在您的应用程序中使用jdbc/MyDataSource名称,如jdbc/MyDataSourcejms/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.propertiesfile:/etc/sysenv作为位置,配置spring以查找属性${ds.jndi}的JNDI。 我还将ignoreResourceNotFound设置为true这样开发人员就不需要在他们的机器上安装/etc/sysenv

4)我使用Cargo + Jetty进行集成测试,我无法在那里正确设置JNDI环境。 所以我也使用JndiObjectFactoryBeandefaultObject属性配置了后备JndiObjectFactoryBean