何时以及为何使用EclipseLink缓存?

时间:2013-09-20 13:25:40

标签: java persistence jpa-2.0 eclipselink ejb-3.0

在我们的开发团队中,我注意到了两种使用EntityManager的方法:

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;
    }
    }

这两种方法有什么区别?

正确的方法是什么?

1 个答案:

答案 0 :(得分:2)

EntityManagerFactory#getCache()返回二级缓存,即所有EntityManager实例共有的缓存。 EclipseLink自动使用共享对象缓存,因此如果多个EntityManager查询同一个对象,则不必多次联系数据库。

通常,您可能必须逐出(=清除)二级缓存的唯一原因是您是否直接修改了数据库(例如,使用直接JDBC调用或任何其他不使用JPA持久性单元的进程)。如果情况并非如此,请不要逐出缓存 - 这将使其无效并减慢您的应用程序。

有关详细信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching