2013-03-11 54 views
1

@辛格爾頓的EJB這樣的:單EJB與PersistenceContext和LockType.READ

@Singleton 
    public class MySingleton { 
    @PersistenceContext 
    private EntityManager em; 
    ... 

    @Lock(LockType.READ) 
    public void doPersistanceAction() { 
    } 

    } 

所以MySingleton#doPersistanceAction()的所有調用將同時使用的EntityManager的同一個實例。連接實體的持久化上下文將在呼叫者之間共享。由一個調用者開始的事務可能由另一個調用者提交。 ejb容器是否處理這種情況?

回答

1

所以MySingleton#doPersistanceAction()的所有調用將使用的EntityManager相同 實例同時

是的,但它不是一個優選&不是線程安全的。相反,你應該注入EntityManagerFactory &然後在方法中,你可以從它得到EntityManager

和持久性與附着實體來說上下文將共享 呼叫者之間

是,相同EntityManager實例共享。

和交易由一個呼叫者可以啓動另一個

LockType.READ被COMMITED:對於只讀操作。允許同時訪問指定爲READ的方法,只要不存在WRITE鎖定即可。

因此,由於您擁有隻讀操作,所以應該沒有關係,但您需要重新訪問設計。

ejb容器是否處理這種情況?

容器將負責初始化,注入,併發等單身bean,但你必須正確使用它。