Tomcat против Weblogic JNDI Поиск - PullRequest
       26

Tomcat против Weblogic JNDI Поиск

25 голосов
/ 06 сентября 2008

Используемые нами серверы 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) для облегчения работы в различных средах.

Есть ли элегантный способ решения этой проблемы. Могу ли я искать имена JNDI непосредственно в Tomcat? Может ли Spring взять имя и посмотреть в обоих местах? Поиски или предложения Google будут отличными.

Ответы [ 8 ]

19 голосов
/ 24 ноября 2010

Как использовать одно имя JNDI в вашем веб-приложении

Я боролся с этим несколько месяцев сам. Лучшее решение - сделать ваше приложение переносимым, чтобы у вас было одинаковое имя JNDI как в Tomcat, так и в Weblogic.

Чтобы сделать это, вы должны изменить 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>

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>
11 голосов
/ 14 января 2009

JndiLocatorSupport имеет свойство resourceRef. При установке этого true префикс «java: comp / env /» будет добавлен автоматически. Поэтому я считаю, что было бы правильно дифференцировать этот параметр при переходе с Tomcat на Weblogic.

2 голосов
/ 09 августа 2011

Следующий конфиг работает в 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 с именем jdbc/AgriShare. В разделе «Цели», УБЕДИТЕСЬ, ЧТО ВЫ ПРЕДЛАГАЕТЕ ДАННЫЕ НА СЕРВЕР, НА КОТОРЫЙ ВЫ РАБОТАЕТЕ С ПРИЛОЖЕНИЕМ! . Этот конкретный момент стоил мне времени сейчас ...

2 голосов
/ 19 июня 2009

Я справился с трюком с Tomcat и WebLogic, используя Spring. Здесь - описание того, как это работает для меня.

1 голос
/ 27 января 2011

Настройка DataSource в самом приложении не такая уж и безумная :) Я бы сказал, что это даже обязательно, если приложение предназначено для развертывания в сети. Река, GigaSpaces или аналогичные.

Примечание. Я не говорю, что параметры подключения должны быть жестко заданы внутри WAR, они должны быть указаны во время развертывания / выполнения. Это упрощает управление облачными экземплярами, поскольку их можно настроить только на месте.

Настройка ресурсов в контейнере имеет смысл, только если там развернуто несколько приложений, и они могут использовать общий ресурс.

Опять же, в облачных типах развертываний существует только одно приложение на экземпляр контейнера сервлета.

1 голос
/ 14 января 2009

Как вы ссылаетесь на ресурс весной?

Вот что мы имеем для кота:

Контекст:

<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"/>

Пространство имен Джи происходит из:

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

1 голос
/ 07 сентября 2008

Как насчет переменной среды? Задайте разработчикам машины с именем tomcat и производство с именем Weblogic. Вы даже можете настроить свой код на использование кода по умолчанию (WebLogic) в случае, если переменная не существует.

0 голосов
/ 09 сентября 2008

В моем приложении также была похожая проблема, и вот как я ее решил:

1) WEB-INF/classes/application.properties содержит запись:

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

2) На компьютере WLS у меня есть запись в файле /etc/sysenv:

ds.jndi=wlsds

3) Я настроил Spring для поиска JNDI в свойстве ${ds.jndi}, используя бин PropertyPlaceholderConfigurer с classpath:application.properties и file:/etc/sysenv в качестве местоположений. Я также установил ignoreResourceNotFound на true, чтобы разработчикам не нужно было иметь /etc/sysenv на своих машинах.

4) Я запустил интеграционный тест с использованием Cargo + Jetty и не смог правильно настроить среду JNDI. Итак, у меня настроен запасной вариант BasicDataSource с использованием свойства defaultObject JndiObjectFactoryBean.

...