Как гарантированно гарантированно работать с @PersistenceContext? - PullRequest
4 голосов
/ 06 января 2010

Согласно многим примерам, можно внедрить EntityManager в EJB @Stateless или @Singleton следующим образом:

@Stateless // or @Singleton
public class MyRepository {
   @PersistenceContext
   private EntityManager em;
   ...
}

Спецификация EJB 3.1 говорит, что внедрение зависимостей выполняется только во время построения, поэтому все вызывающие объекты MyRepository будут использовать один и тот же экземпляр EntityManager. Как контейнер EJB гарантирует, что используется правильный экземпляр EntityManager?

1 Ответ

3 голосов
/ 06 января 2010

Насколько я понимаю, компонент @Stateless никогда не будет использоваться двумя клиентами одновременно; контейнер просто создаст несколько экземпляров одного и того же компонента, если ему нужно будет обслуживать несколько клиентов.

Что касается @Singleton bean-компонентов, то spec говорит, что по умолчанию они используют управляемый контейнером параллелизм, где контейнер использует метод Lock s и могут отклонять клиентов с исключением по таймауту синглтон занят.

Редактировать: кроме того, по умолчанию тип @PersistentContext ограничен транзакцией (в спецификации 16.11.1.1), поэтому все объекты, управляемые EntityManager, отсоединяются в конце каждой транзакции.

...