Обработка соединений в сеансовых компонентах EJB2

Недавно я начал поддерживать старое приложение EJB2, работающее на OC4J. Это включает в себя доклет EJB и другие ужасные ужасные вещи. В настоящее время каждый метод создает ConnectionFactory, который запрашивает JNDI для Datasource, который затем создает соединение. Это приводит к большому количеству стандартного кода.

Теперь мой вопрос: безопасно ли делать это только один раз для сеанса без сохранения состояния и повторно использовать одно и то же соединение? ejbCreate() получит соединение от JNDI, а затем закроет его в ejbRemove().
Будет ли это хорошим или плохим решением?


person Rasmus Franke    schedule 30.01.2012    source источник


Ответы (1)


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

Методы ejbCreate() и ejbRemove() вызываются контейнером, когда bean-компонент инициализируется в первый раз и когда он удаляется из пула соответственно. Поэтому он может открыть соединение в ejbCreate(), но не может закрыть его и обслуживать запросы с тем же соединением.

Но если соединение открыто, а bean-компонент остается бездействующим в пуле, он будет излишне задерживать ресурсы, что может привести к исключениям, таким как тайм-аут сокета, слишком много открытых соединений и т. д.

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


Редактировать: Из базовых шаблонов J2EE — Service Locator

Используйте объект Service Locator, чтобы абстрагироваться от всего использования JNDI и скрыть сложности создания начального контекста, поиска домашнего объекта EJB и повторного создания объекта EJB. Несколько клиентов могут повторно использовать объект Service Locator, чтобы уменьшить сложность кода, обеспечить единую точку управления и повысить производительность за счет кэширования.

person Nayan Wadekar    schedule 30.01.2012
comment
Как насчет других сеансовых компонентов? Безопасно ли их кэшировать (инициализировать в ejbCreate) в сеансовых компонентах, как я сейчас делаю с подключениями? - person Rasmus Franke; 31.01.2012
comment
Пожалуйста, обратитесь к части редактирования для кэширования bean-компонентов без сохранения состояния, эти bean-компоненты не должны содержать переменные экземпляра. - person Nayan Wadekar; 31.01.2012
comment
Обратите внимание, что желательно иметь переменные экземпляра, если они потребляют ресурсы и являются общими, например, для кэширования некоторых данных из базы данных. - person Nayan Wadekar; 01.02.2012