我一直在使用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