0

オブジェクトをクエリしたり、削除/作成したりするときに、エンティティ マネージャーの適切な使用法を理解するのに苦労しています。現在、データベーストランザクションに対して、次のように新しいエンティティマネージャーを開閉するサービスメソッドがいくつかあります。

public static Long getCountApplicants(String active){

    EntityManager entityManager = factory.createEntityManager();
    long value = (Long) entityManager.createQuery("select count(distinct a) from    Applicant a  where a.active = " +active).getSingleResult();
    System.out.println("get count app query");
    entityManager.close();
    return value;
}

ユニットを定義する persistence.xml ファイルを含む Java EE アプリがあるのに、ファクトリから 1 つだけを宣言して、アプリの存続期間全体でそれを使用できないのはなぜですか? これらのオブジェクトを 1 つだけ使用した場合、パフォーマンスやメモリ リークの問題はありますか?

アップデート:

次のスタック、Spring Framework/JPA Eclipselink を使用しています。

4

2 に答える 2

2

簡単に言うと、Spring を使用しているため、次のように Entity Manager を DAO の属性として定義することをお勧めします。

@PersistenceContext
EntityManager em;

コードは次のようになります。

public static Long getCountApplicants(String active){
    long value = (Long) em.createQuery("select count(distinct a) from    Applicant a  where a.active = " +active).getSingleResult();
    System.out.println("get count app query");
    return value;
}

これは、非拡張永続コンテキストでのみ機能します。
Spring によって注入された EntityManager はスレッドセーフになります。アプリケーション管理またはコンテナー管理の Entity Manager
を構成する必要があるかどうかは、Spring 構成ファイルの構成の問題です。LocalEntityManagerFactorBeanLocalContainerEntityManagerFactoryBean

于 2012-07-17T02:32:06.460 に答える
1

アプリケーションが管理する場合、EntityManager は一般にスレッドセーフではありません。

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html

ただし、コンテナー管理バージョンを使用している場合は、そうする必要があります。あなたはそれを注入します:

@PersistenceContext
EntityManager entityManager;

Spring は、これを実行できるコンテナーの 1 つです。上記のリンクは役立つリソースです。

于 2012-07-17T02:05:46.323 に答える