1

@Singleton EJB は次のようになります。

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

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

  }

したがって、MySingleton#doPersistanceAction() のすべての呼び出し元は、EntityManager の同じインスタンスを同時に使用します。また、エンティティが添付された永続化コンテキストは、呼び出し元間で共有されます。また、ある呼び出し元によって開始されたトランザクションは、別の呼び出し元によってコミットされる場合があります。ejb コンテナーがそのような状況を処理するかどうか。

4

1 に答える 1

1

したがって、 MySingleton#doPersistanceAction() のすべての呼び出し元は、EntityManager の同じインスタンスを同時に使用します。

はい。ただし、優先ではなく、スレッドセーフではありません。代わりに、注入してからEntityManagerFactoryメソッド内で取得する必要がありますEntityManager

また、エンティティが添付された永続化コンテキストは、呼び出し元間で共有されます

はい、同じEntityManagerインスタンスが共有されています。

また、ある呼び出し元によって開始されたトランザクションは、別の呼び出し元によってコミットされる可能性があります

LockType.READ :読み取り専用操作用。WRITE ロックが保持されていない限り、READ として指定されたメソッドへの同時アクセスを許可します。

したがって、読み取り専用の操作を行う場合は問題ありませんが、設計を再検討する必要があります。

ejb コンテナーがそのような状況を処理するかどうか。

コンテナーは、シングルトン Bean の初期化、インジェクション、同時実行などを担当しますが、正しく使用する必要があります。

于 2013-03-12T05:19:09.410 に答える