0

私たちの開発チームでは、 EntityManager を使用する 2 つの方法に気付きました。

1.最初の方法

public class ReferentielDaoImpl implements ReferentielDaoLocal {
      @PersistenceContext(unitName = "ErpCCF-ejbPU")
       private EntityManager em;
public List<Alerte> findAll(){
    try {
                em.getEntityManagerFactory().getCache().evictAll();
                String req = "SELECT a FROM Alerte a ORDER BY a.idAlerte DESC";
                List<Alerte> alertes = em.createQuery(req).getResultList();
                return alertes;
            } catch (Exception e) {
                e.printStackTrace(System.out);
            }
            return null;
}
}

2.セカンドウェイ

public class ReferentielDaoImpl implements ReferentielDaoLocal {
          @PersistenceContext(unitName = "ErpCCF-ejbPU")
           private EntityManager em;
    public List<Alerte> findAll(){
        try {
                    String req = "SELECT a FROM Alerte a ORDER BY a.idAlerte DESC";
                    List<Alerte> alertes = em.createQuery(req).getResultList();
                    return alertes;
                } catch (Exception e) {
                    e.printStackTrace(System.out);
                }
                return null;
    }
    }

これら2つの方法の違いは何ですか?

正しい方法は?

4

1 に答える 1

2

EntityManagerFactory#getCache()第 2 レベルのキャッシュ、つまりすべての EntityManager インスタンスに共通のキャッシュを返します。TopLinkは共有オブジェクト・キャッシュを自動的に使用するため、複数のEntityManagerが同じオブジェクトを問い合せる場合、データベースに複数回アクセスする必要はありません。

通常、第 2 レベルのキャッシュを削除 (= クリア) しなければならない唯一の理由は、データベースを直接変更した場合 (たとえば、JDBC の直接呼び出しまたは JPA 永続ユニットを使用しない他のプロセスを使用) です。そうでない場合は、キャッシュを削除しないでください。キャッシュが役に立たなくなり、アプリケーションの速度が低下します。

詳細については、http://wiki.eclipse.org/EclipseLink/Examples/JPA/Cachingを参照してください。

于 2013-09-20T13:36:42.977 に答える