当前位置:  开发笔记 > 编程语言 > 正文

Entitymanager导致内存泄漏?

如何解决《Entitymanager导致内存泄漏?》经验,为你挑选了1个好方法。

我的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.



1> ecerulm..:

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

EntityManager是轻量级对象,因此不需要只有一个,您可以为每个事务创建一个并在提交事务后关闭它.

通过EntityManager加载/持久存储的所有实体都会保留在内存中,直到您明确地从中分离实体(通过EntityManager.detach()EntityManager.clear()EntityManager.close()).因此,拥有短期的EntityManagers会更好.如果您在获得OOME之后通过相同的EntityManager持久保存1000000个实体而不分离它们(如果您将每个实体保留在其自己的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();
}

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有