【发布时间】:2011-02-27 01:23:37
【问题描述】:
我有一个可怕的问题,希望有一个非常简单的答案。执行基本操作时内存不足
如果我有这样的代码:
MyEntity myEntity;
for (Object id: someIdList) {
myEntity = find(id);
// do something basic with myEntity
}
而find()方法是标准的EntityManager相关方法:
public MyEntity find(Object id) {
return em.find(mycorp.ejb.entity.MyEntity.class, id);
}
这段代码在几周前工作过,如果数据库中的项目较少,它也能正常工作。我面临的结果错误是:
java.lang.OutOfMemoryError: 超出 GC 开销限制
异常来自 oracle toplink 调用一些 oracle jdbc 方法。
之所以存在循环,是因为当有大量记录时,诸如“从 MyEntity 中选择 object(o) as o”之类的 EJBQL 会使应用程序服务器过载。
【问题讨论】:
-
执行 em.clear() 不是我正在寻找的答案......但我会记住它。这个问题的问题在于它曾经可以工作......使用相同级别的数据库条目!这引发了另一个问题——如果我有一个循环,我可以定期刷新/清除..但是当应用程序只是长时间运行时呢? EntityManager 应该管理它管理的数量!
-
EntityManager大部分时间的生命周期都很短(常见的模式是 entitymanager-per-request)。我建议阅读5.1. Entity manager and transaction scopes。如果您不遵循这种模式,那么您将不得不处理“内存处理”。EntityManager将实体保存在内存中以跟踪更改,这就是 JPA 的工作方式,您不能合理地期望EntityManager能够为您加载整个数据库或刷新更改并分离实体。
标签: java jpa jakarta-ee ejb-3.0