gpt4 book ai didi

java - Entitymanager 导致内存泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:16 24 4
gpt4 key购买 nike

我的 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())。所以最好有短命的 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();
}

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com