Получен ли EntityManager через @PersistenceContext в CDI на сервере приложений Java EE для работы с потоками? - PullRequest
0 голосов
/ 01 октября 2018
  • Я знаю, что EntityManager, созданный мной самим, не является поточно-ориентированным.
  • Я знаю, что EntityManager, введенный через @PersistenceContext в EJB, ведет себя как защищенный от взлома, потому что контейнер EJB сериализуетдоступ к EJB-компонентам.
  • Я знаю, что в EJB-инъекции EntityManager действительно является прокси.
  • Я знаю, что когда я внедряю EntityManager через @PersistenceContext в @Dependent компонент CDIи внедрить этот боб в EJB, он ведет себя как потокобезопасный из-за покрытия EJB (я считаю, что в этом случае EntityManager также является прокси).

Но:

  • Что происходит, когда я внедряю EntityManager через @PersistenceContext в компонент CDI и использую этот компонент напрямую, например, в Servlet?Я считаю, что этот EntityManager является прокси, поэтому этот прокси гарантирует безопасность потоков?

Редактировать: Подобный вопрос Java CDI @PersistenceContext и безопасность потоков делает 'Это не решает мою проблему, потому что принятый ответ показывает примеры EJB, а не примеры CDI.

Edit: Я проверил исходный код сервера приложений WildFly и похоже, что WildFly использует поточно-ориентированныйпрокси в CDI.Этот прокси выбирает настоящий EntityManager, когда это необходимо.Настоящие EntityManager хранятся в специальной структуре - стек карт EntityManager в ThreadLocal.

1 Ответ

0 голосов
/ 02 октября 2018

https://www.javacodegeeks.com/2013/06/jpa-2-entitymanagers-transactions-and-everything-around-it.html говорит:

Самое большое преимущество использования Transaction Scoped Entity Manager заключается в том, что он не имеет состояния.Это также делает потоковый объект EntityManager потокобезопасным и, таким образом, практически не требующим обслуживания

. Также в профессиональной книге JPA говорится:

менеджер сущностей в области транзакций не имеет состояния, что означает, что он можетбезопасно храниться в любом компоненте Java EE

...