Исключение с помощью entitymanager и glassfish v3 - illegalstateexception: попытка выполнить операцию на закрытом entitymanager - в чем проблема?
Я работаю в проекте, который использует JavaEE. Я работаю с серверами Glassfish версии 3. У меня часто возникают проблемы (не всегда) в моих одноэлементных EJB, которые используют экземпляр EntityManager. Очень часто я получаю эту ошибку:
[timestamp] [http-thread-pool-8080(49)] ERROR com.sun.xml.ws.server.sei.TieHandler.serializeResponse Attempting to execute an operation on a closed EntityManager. java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager. at org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpen(EntityManagerImpl.java:1662) ~[org.eclipse.persistence.jpa.jar:2.3.4.v20130626-0ab9c4c] at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:643) ~[org.eclipse.persistence.jpa.jar:2.3.4.v20130626-0ab9c4c] at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:532) ~[org.eclipse.persistence.jpa.jar:2.3.4.v20130626-0ab9c4c] at com.sun.enterprise.container.common.impl.EntityManagerWrapper.find(EntityManagerWrapper.java:320) ~[container-common.jar:3.1.2.1]
Журнал идет дальше, но я только что показал его верхнюю часть. Следующей строкой журнала был вызов веб - сервиса, развернутого на том же сервере. И когда эта ошибка происходит, она всегда возникает из-за вызова веб-сервиса, развернутого на том же сервере, который выполняет поиск в базе данных с помощью метода "find" из экземпляра entityManager.
Менеджер сущностей вводится вне Боба в @PostConstruct аннотированного класса @WebService, используя строку '(EntityManager)new InitialContext().lookup("java:comp/env/persistence/etc");' это класс, который получает все входящие запросы и решает, какой Боб должен быть вызван на основе запроса.
Сразу после получения запроса этот класс вызывает соответствующий одноэлементный компонент на основе запроса, передавая введенный EntityManager соответствующему компоненту.
Я понимаю, что EntityManager закрывается, когда я пытаюсь выполнить эту операцию, и это действительно проблема. Однако я думал, что это открытие и закрытие EntityManager управляется автоматически. Очевидно, это не работает таким образом. Я также не закрываю EntityManager непосредственно в любом месте кода.
Я не вижу никакого разумного решения этой проблемы. Все, что я нахожу в онлайн-ресурсах, это то, что это может быть ошибка Glassfish, и перезапуск сервера обычно работает. Ничего конкретного, чтобы решить эту проблему.
Некоторая информация, присутствующая в модуле PersistenceUnit, настроенном в persistence.xml файл, который я использую, представлен ниже.
<persistence-unit> name="XXX" transaction-type="JTA" <provider>org.eclipse.persistence.jpa.PersistenceProvider></provider> <jta-data-source>jdbc/YYY</jta-data-source> <properties> <property name="eclipselink.target-database" value="Oracle"/> <property name="eclipselink.cache.shared.default" value="false"/> <property name="eclipselink.cache.size.default" value="0"/> <property name="eclipselink.cache.type.default" value="None"/> <property name="eclipselink.weaving.internal" value="false"/> <property name="toplink.target-database" value="Oracle"/> <property name="eclipselink.session.customizer" value="aaa.bbb.ccc.IsolateEmbeddablesCustomizer"/> </properties> <exclude-unlisted-classes>true</exclude-unlisted-classes> </persistence-unit>
У вас есть какие-нибудь идеи о том, как решить эту проблему или что я делаю не так?
Спасибо.
Что я уже пробовал:
-Перезагрузите сервер (работает временно)