Я разрабатываю свое веб-приложение, используя реализацию 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
И, конечно же, все управляемые компоненты (обычно RequestScoped или ConversationScoped), которые хотят получить доступ к базе данных, делают это следующим образом:
@Inject private LocationControl lc;
Итак, мой вопрос заключается в следующем: получил ли я это исключение с помощью @ApplicationScoped DAO? Я думал, что так будет более эффективно, поскольку контейнеру не нужно будет постоянно воссоздавать этот объект при каждом запросе, если у него нет области действия, а у DAO нет собственного состояния. Однако если объекты EntityManager и UserTransaction должны быть отдельными экземплярами для каждого пользователя, это будет проблемой.
В качестве альтернативы я мог бы использовать синхронизированные методы DAO, но я думаю, что это приведет к блокировке потоков в контейнере (GlassFish).
Любые советы приветствуются.
LocationControlобычно должен был быть@StatelessEJB и должен быть внедрен@EJB. Я не знаю, что означает@Model, но в бизнес-классе это плохо пахнет. - person BalusC   schedule 30.08.2011