Я разрабатывал свое веб-приложение с использованием реализации JPA 2.0 EclipseLink 2.2.0. Я наконец-то дошел до выполнения многопоточного кода и получил это исключение:
java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager.
Объекты, которые имеют все вызовы javax.persistence в моем приложении, определяются как область приложения, например:
@Model
@ApplicationScoped
public class LocationControl implements Serializable {
@PersistenceContext private EntityManager em;
@Resource private UserTransaction utx;
// etc
И, конечно, все управляемые bean-компоненты (обычно RequestScoped или ConversationScoped), которые хотят получить доступ к базе данных, делают так:
@Inject private LocationControl lc;
Итак, мой вопрос таков: получил ли я это Исключение с помощью @ApplicationScoped DAO? Я думал, что так будет эффективнее, поскольку контейнеру не нужно будет постоянно создавать этот объект при каждом запросе, если у него нет области действия, а у DAO нет собственного состояния. Однако если объекты EntityManager и UserTransaction должны быть отдельными экземплярами для каждого пользователя, это будет проблемой.
В качестве альтернативы, я мог бы использовать syncrhonized для методов DAO, но я думаю, что это приведет к блокировке потоков в контейнере (GlassFish).
Любой совет приветствуется.