3

私のプロジェクトでは、永続性の管理をアプリケーションからコンテナーに切り替えようとしています。私は次の指示に従っています: http://docs.oracle.com/javaee/6/tutorial/doc/gkhrg.html

EntityManager がスレッドセーフではないことについて読んだことがありますが、セットアップが正しいことを確認したいだけです。私の懸念: http://weblogs.java.net/blog/2005/12/19/dont-use-persistencecontext-web-app

永続コンテキストを生成するクラスがあります。

@Singleton
public class JpaResourceProducer {

    //The "pu" unit is defined with transaction-type="JTA"
    @Produces
    @PersistenceUnit(unitName = "pu")
    @Database
    EntityManagerFactory databasePersistenceUnit;

    @Produces
    @PersistenceContext(unitName = "pu")
    @Database
    EntityManager databaseEntityManager;

    /* Alternative
    @PersistenceContext(unitName = "pu")
    private EntityManager em;

    @Produces
    @UserDatabase
    public EntityManager create() {
        return em;
    }

    public void close(@Disposes @Database EntityManager em) {
        em.close();
    } 
    */
}

次に、DAO を注入する jax-rs リソースがあります。

@RequestScoped
@Path("/endpoint")
public class MyResource {

    @Inject private Dao dao;

    @GET
    @Produces({MediaType.APPLICATION_JSON})
    public Converter get() {

        MyEntity entity = dao.find(1);

        Converter converter = new Converter(entity);
        return converter;
    }

}

そして最後にDAOEntityManager.

@Singleton
public class JpaDao<T, K extends Serializable> implements Dao<T, K> {

    protected Class<T> entityClass;

    @Inject
    @Database
    EntityManager em;

    public JpaDao() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
    }

    public T find(K id) {
        return em.find(entityClass, id);
    }

    ....
}

1. これは、スレッドの安全性と全体的なパフォーマンスの点で適切な設定ですか?


おまけの質問:

には、破棄時にマネージャーを手動で閉じるJpaResourceProducerための代替セットアップがあります。EntityManager

2. コンテナの取り扱いはEntityManager自動的に終了しますか?

Oracle の例には、EntityManagerFactory.

EntityManagerFactory3. CMP を使用している場合、本当に必要ですか?

4

1 に答える 1

0

あなたの容器は何ですか?使用された注釈から、少なくとも Java EE 6 Web プロファイルと互換性があると推測されます。その場合、これは複雑すぎます。

  1. このチュートリアルでは、複数の持続性ユニットの生成について説明します。これはあなたのアプリケーションに当てはまりますか?そうでない場合は、EJB へのプレーン インジェクションの方が信頼性が高く、魔法が少なくなります。また、シングルトンで生成された永続コンテキストのトランザクション動作についても確信が持てません。

  2. シングルトンJpaDAOとは、アプリケーションで一度に 1 つのデータベース操作しか実行できないことを意味するため、これは深刻なパフォーマンスのボトルネックになります。代わりにステートレスにする必要があります(そして、従来の方法で永続化コンテキストを注入します)。

一般に、DAO とビジネス ロジック、さらには JAX-RS エンドポイントをセッション EJB として実装し、コンテナが同時実行性とトランザクションを適切に処理できるようにします。Adam Bien の JavaEE Patternsなど、他のソースの例も使用してください。

于 2012-09-16T10:29:22.693 に答える