Как вы разделяете ресурс системы кэширования Java (JCS) между несколькими EJB

Я использую JCS для хранения результатов поиска ldap, которые должны использоваться несколькими EJB. Я создал одноэлементный класс для инициализации JCS только один раз, но из-за загрузчика классов EJB он был инициализирован несколько раз своей собственной копией. поэтому поисковые ресурсы не используются совместно.

Как вы, ребята, решаете проблему, когда вам нужно разделить кеш между несколькими bean-компонентами? Я ищу кеш в JVM. (Не удаленный, например, memcached и т. д.).

Glassfish используется в качестве сервера приложений.


person rjoshi    schedule 30.09.2009    source источник
comment
Не могли бы вы рассказать нам немного больше об упаковке ваших EJB и проблемах с загрузчиком классов?   -  person Pascal Thivent    schedule 02.10.2009


Ответы (2)


Я еще не смог протестировать его, но думаю, что один из методов, описанных в Глава "Обход изоляции загрузчика классов" Руководства по разработке приложений для используемой вами версии Glassfish может решить вашу проблему.


Краткая версия, по крайней мере, действительная для версий 2-3-4: используйте общий загрузчик классов (что именно делает этот общий загрузчик классов и его связь с другими загрузчиками классов объясняется в том же руководстве). Есть несколько способов сделать это:

  • скопируйте банку в domain-dir/lib
  • или скопируйте банку в папку as-install/lib
  • или запустите asadmin add-library --type common /path/to/your.jar (будет работать только в версии 4 iirc)

Здесь на SO есть несколько вопросов, связанных с «обходом изоляции загрузчика классов» (просто используйте этот поисковый запрос), посмотрите примеры и дополнительные обсуждения.

person fvu    schedule 02.10.2009

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

Таким образом, если каждый компонент EJB развертывается отдельно со своей собственной копией файла jar кеша, каждый из них получит свою собственную копию.

Если ваши bean-компоненты развернуты в составном EAR, совместно использующем один экземпляр библиотеки jar, то этот кеш будет общим для всех bean-компонентов в EAR.

Если вы полностью удалите библиотеку из развертывания и поместите ее вне контейнера (например, $DOMAIN/lib/ext), то этот кеш будет совместно использоваться ВСЕМ в домене (EJB, EAR, WAR и т. д.).

person Will Hartung    schedule 02.10.2009
comment
Спасибо за Ваш ответ. Кэш JCS является частью общей библиотеки, которая совместно используется несколькими EJB и компонентами привязки (OpenESB), но я думаю, что $DOMAIN/lib должен решить проблемы. - person rjoshi; 02.10.2009