我一直在使用JPA 2.0实现EclipseLink 2.2.0开发我的web应用程序。我终于可以运行多线程代码,我得到这个异常:关于多线程和EntityManager的问题
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对象必须是每个用户的独立实例,那么这将是一个问题。
或者,我可以在DAO方法上使用syncrhonized,但我认为这会导致容器中的线程锁定(GlassFish)。
任何意见赞赏。
我没有做CDI,但'LocationControl'通常应该是一个'@ Stateless' EJB,并且要被'@ EJB'注入。我不知道'@ Model'代表什么,但是这对商业服务类来说是错误的。 – BalusC