Я работаю в проекте, который использует 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]
Журнал продолжается, но я только что показал его. Следующей строкой журнала был вызов WebService, развернутого на том же сервере. И когда эта ошибка возникает, она всегда возникает из-за вызова WebService, развернутого на том же сервере , , который выполняет поиск в базе данных, используя метод 'find' из экземпляра entityManager. .
Менеджер сущностей внедряется вне bean-компонента в @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>
Есть ли у вас какие-либо идеи о том, как решить эту проблему, и кто-нибудь из вас тоже получил такую же ошибку?
Спасибо.