Обработка соединения в сессионных компонентах EJB2 - PullRequest
0 голосов
/ 30 января 2012

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

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

1 Ответ

1 голос
/ 30 января 2012

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

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

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

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


Редактировать: Из базовых шаблонов J2EE - локатор службы

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

...