Проблема контекстно-зависимых параметров JNDI в Tomcat 6 - PullRequest
9 голосов
/ 11 ноября 2010

У меня проблемы с использованием JNDI, когда два или более приложений развернуты на Tomcat 6. Рассмотрим следующий сценарий: у меня есть 2 веб-приложения, где каждый файл web.xml содержит один параметр JNDI.web.xml webapp A:<br/> <code><env-entry><env-entry-name>testEntry</env-entry-name><env-entry-value>value A</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry>

web.xml webapp B:<br/> <code><env-entry><env-entry-name>testEntry</env-entry-name><env-entry-value>value B</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry>

Когда я развертываю оба веб-приложения и ищу значение для testEntry, оба веб-приложения возвращают значение A. Похоже, доступны только параметры JNDI из первого загруженного файла web.xml.Согласно моему пониманию JNDI, каждый web.xml содержит специфичные для веб-приложения значения JNDI, которые доступны только в их соответствующем контексте.Что я здесь делаю / думаю неправильно?

Это приводит к моему следующему вопросу.Как определить глобальные параметры JNDI, которые доступны во всех контекстах?В документации по Tomcat я читал, что для этой цели вы должны использовать {CATALINA_HOME} /conf/context.xml.Но записи среды не доступны в контекстах.Размещение их в {CATALINA_HOME} /conf/web.xml делает их глобально доступными, но я сомневаюсь, что это правильный путь.

Это мой Java-код для их поиска: Context initCtx = new InitialContext();<br/> Context envCtx = (Context) initCtx.lookup("java:comp/env");<br/> String value = (String)envCtx.lookup("testEntry");<br/>

Любая помощь будет приветствоваться, потому что хорошей документацией по JNDI являются шрамы.

Ответы [ 4 ]

3 голосов
/ 22 августа 2012

КСТАТИ

  1. вам не нужны вещи в web.xml.
  2. вам не нужно изменять /tomcat6/conf/context.xml

Все, что вам нужно, это поместить context.xml в ваш META-INF каталога WebContent внутри war. JNDI будет зарегистрирован автоматически, и пул будет создан при загрузке приложения.

Только при желании вы можете поместить его в /tomcat6/conf/context.xml, но для этого потребуется перезапуск tomcat после каждого изменения конфигурации.

Вот хорошая конфигурация для моего sql. Важным моментом является logAbandoned (для обнаружения незакрытых соединений, которые были выброшены из пула контейнером, потому что ваш код забыл закрыть его). Для проверки запроса я предлагаю что-то, чтобы проверить наличие таблицы базы данных.

<Resource name="jdbc/NAME" auth="Container" type="javax.sql.DataSource"
               maxActive="100" minIdle="10" maxWait="10000" removeAbandoned="true"
               removeAbandonedTimeout="60" logAbandoned="true"
               testWhileIdle="true" testOnBorrow="true" testOnReturn="false"
               timeBetweenEvictionRunsMillis="5000"
               validationQuery="SELECT 1" initialSize="10"
               username="usrname" password="password"   
               driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/databb?autoReconnect=true"/>
2 голосов
/ 19 сентября 2011

Что ж, я снова посещал территорию JNDI и столкнулся с похожим вариантом использования. Теперь мне это удалось.

Если вам нужен доступ к простым переменным JNDI в веб-приложении, они должны быть определены в элементе вашего веб-приложения. Но синтаксис для определения записи среды в контексте отличается от синтаксиса, который должен использоваться в дескрипторе веб-приложения (см. Мой оригинальный пост). Вот тут и началось мое замешательство.

В контексте это должно быть похоже:

Для глобальных переменных я по-прежнему предполагаю, что {CATALINA_HOME} /conf/context.xml будет местом для размещения этих записей среды.

Смотрите документацию по apache: http://tomcat.apache.org/tomcat-5.5-doc/config/context.html#Environment_Entries

В любом случае, спасибо за вашу помощь!

0 голосов
/ 05 февраля 2011

Из приведенного вами примера я понимаю, что «значение A» должно быть определено только для (и доступно из) веб-приложения A и наоборот.

Одним из способов достижения этого является определение их как параметров контекста (не ресурсов JNDI) в файле META-INF / context.xml каждого веб-приложения, как описано здесь .Если вы сделаете это, вы можете быть уверены, что каждый параметр доступен только из собственного веб-приложения.

0 голосов
/ 11 ноября 2010

Я недавно гуглил материалы JNDI, также новичка в этой теме.Я думаю, что эта ссылка (ключевое слово ResourceLink здесь) является тем, что вы ищете.Ура!

...