在我们的开发团队中,我注意到有两种使用 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; 
    } 
    } 

这两种方法有什么区别?

正确的方法是什么?

请您参考如下方法:

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

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

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!