我的Java应用程序内存泄漏很慢。我想知道这是否可能是由于使用时不总是关闭Entitymanager引起的。但是,使用myeclipse生成数据库代码,我得到的是这样的方法:

public Meit update(Meit entity) {
    logger.info("updating Meit instance");
    try {
        Meit result = getEntityManager().merge(entity);
        logger.info("update successful");
        return result;
    } catch (RuntimeException re) {
        logger.error("update failed");
        throw re;
    }
}

其中从不关闭EntityManager。考虑到这是生成的代码,我想知道谁是对的,对我还是对IDE。

最佳答案

正如@Ruggs所说,如果您要自己管理EntityManager的生命周期(而不是由J2EE完成CMP容器管理的持久性),则需要自己关闭EntityManager或至少调用EntityManager.clear()来分离实体。

EntityManager是轻量级的对象,因此不需要一个对象,您可以为每个事务创建一个对象,并在提交事务后将其关闭。

通过EntityManager加载/持久化的所有实体都保留在内存中,直到您明确地将实体与实体分离(通过EntityManager.detach()EntityManager.clear()EntityManager.close())。因此,最好使用短暂的EntityManager。如果您通过同一EntityManager持久存储1000000个实体而没有分离它们,则将获得一个OOME(如果将每个实体持久存储在它自己的EntityTransaction中,都没有关系)。

所有这些都在http://javanotepad.blogspot.com/2007/06/how-to-close-jpa-entitymanger-in-web.html帖子中进行了解释。

作为一个示例(摘自较早的文章),如果要避免“内存泄漏”,则应执行以下操作(如果不使用CMP):

EntityManager em = emf.createEntityManager();

try {
  EntityTransaction t = em.getTransaction();
  try {
    t.begin();
    // business logic to update the customer
    em.merge(cust);
    t.commit();
  } finally {
   if (t.isActive()) t.rollback();
  }
} finally {
  em.close();
}

关于java - Entitymanager导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/706238/

10-12 04:30