Вопрос

Серверы Weblogic, которые мы используем, настроены на разрешение использования имен источников данных JNDI, таких как «appds».

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

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

Это было полезно?

Решение

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

Другие советы

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

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

Для этого вы измените свой web.xml и spring-beans.xml чтобы указать на одно имя jndi и обеспечить сопоставление с именем jndi каждого поставщика.

Я поместил каждый файл ниже.

Тебе нужно:

  • А <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>

веб.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>

МЕТА-INF/context.xml (для Томкэта)

<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>

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

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

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

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

Вот что у нас есть для кота:

контекст:

<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

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

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

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

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

В моем приложении также была аналогичная проблема, и я решил ее следующим образом:

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top