关于Java:Tomcat与Weblogic JNDI查找

关于Java:Tomcat与Weblogic JNDI查找

Tomcat vs Weblogic JNDI Lookup

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

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

你需要:

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

    • 这可以在Tomcat安装中,也可以在您的应用程序中。

通常,最好在应用程序中使用您的jndi名称,例如jdbc/MyDataSourcejms/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文件中有一个条目:

1
ds.jndi=wlsds

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

4)我使用Cargo + Jetty进行了集成测试,但无法在此处正确设置JNDI环境。因此,我也使用JndiObjectFactoryBeandefaultObject属性配置了后备BasicDataSource


推荐阅读

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    酷睿I7 配置

    酷睿I7 配置,配置,玩家国度啦华硕 Rampage II Extreme(3800元)如果米不够,也可以把Extreme改为Gene,不过是小板内存推荐金士顿6G DDR3 2000骇

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    查看配置:酷睿i3530集展示办公平台

    查看配置:酷睿i3530集展示办公平台,,由于时间和精力的关系,我们不可能对所有的配置进行评论,希望我们能理解,我希望我们的评论能在那些需要帮

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    迈腾电脑主板|迈腾最好的主机

    迈腾电脑主板|迈腾最好的主机,,迈腾最好的主机20款迈腾330豪华发动机型号EA888-DPL2020款迈腾330TSI搭载大众集团经典的EA888-DPL型号2.0T