2009-11-17 2 views
2

У меня есть веб-приложение J2EE, которое используется для загрузки файла, который затем обрабатывается процедурой базы данных. Поскольку мы не хотим, чтобы webapp приходилось ждать завершения процедуры базы данных, она выполняется в другом потоке.Следует ли искать имя jndi для источника данных с помощью ServiceLocator?

Процесс, выполняющийся в отдельном потоке, должен получить и закрыть свое собственное соединение. Webapps обычно ищут имя jndi datasource, используя ServiceLocator, который, в свою очередь, ищет его из контекста приложения (ключ поиска для имени jndi определяется как константа класса), но для отдельного потока, ищущего имя jndi с помощью ServiceLocator выходит из строя. Чтобы обойти эту проблему, мы использовали имя jndi как константу класса, чтобы поток мог напрямую искать источник данных.

Это означает, что имя jndi для источника данных теперь исправлено для приложения, и мы больше не можем развертывать одно и то же приложение в одном контейнере, но с разными источниками данных, просто изменив web.xml.

Что такое лучшие в отрасли методы? Должно ли имя jndi быть настроено или это нормально, чтобы исправить его для приложения? Кто-нибудь реализовал конфигурируемое решение имен jndi datasource, которое можно использовать как в webapp, так и в других потоках в контейнере?

ответ

1

Да, я чувствую вашу боль.

Я действительно думаю, что это очень хорошая идея, чтобы попытаться настроить jndi через web.xml. То, как я справлялся с этим, кэшируется ссылкой на источник данных. iow, при запуске webapp ссылка на источник данных предоставляется в то время, когда она доступна для потока, а затем передается или предоставляется любому другому объекту, который ее требует.

1

Вы можете передать имя JNDI или DataSource в качестве аргумента конструктора или метода класса потока.

2

Для лучших практик, The role of JNDI in J2EE (в соавторстве с Kirk Pepperdine) является одной из лучших статей, которые я нашел. В нем четко объясняется «видение» Солнца относительно разработки, упаковки, развертывания и того, как JNDI подходит там.

Короткая версия, что Sun и серверы приложений провайдеры предоставляют возможность определить, и назвать глобального ресурса (Java: DefaultDS) и связывать с именем локального реф ресурсов (JDBC/mydatasource) к указанному ресурсу ,

Это решает проблему переносимости приложения (из компонентов J2EE). Но локальное имя ресурса ресурса является специфичным для компонента, поэтому оно не решает вашу проблему (которая развертывает один и тот же компонент несколько раз, но с другим именем ресурса локального ресурса).

Иными словами, видение Солнца не касается вашего конкретного варианта использования (хотя я считаю, что это допустимый прецедент). С моделью Sun вы должны решить эту проблему при сборке/упаковке (т. Е. Создать и собрать две версии компонента, каждый из которых использует определенное имя ресурса локального ресурса).

Программный подход, который вы описываете (выполнение поиска значения из ключа, хранящегося в JDNI/свойства/независимо), является обходным путем.

Смежные вопросы