我有一个可怕的问题,希望有一个非常简单的答案。我的计算机运行时内存不足,我执行基本加载Java实体时内存不足
如果我有这样的代码:
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中选择对象(o)为o”的EJBQL会在有很多记录时超载应用程序服务器。
执行em.clear()不是我正在寻找的答案...但我会牢记它。 这个问题的问题是,它曾经工作......具有相同级别的数据库条目! 这又提出了另一个问题 - 如果我有一个循环,我可以定期刷新/清除..但是当应用程序只是长时间运行时怎么办? EntityManager应该管理它管理的多少! – 2010-06-03 14:07:38
'EntityManager'大部分时间都是短生命周期(常见模式是* entitymanager-per-request *)。我建议阅读[5.1。实体经理和交易范围](http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/#transactions-basics)。如果你不遵循这种模式,那么你将不得不处理“内存处理”。 EntityManager使内存中的实体保持跟踪更改,这就是JPA的工作方式,您不能合理地期望EntityManager能够加载整个数据库或为您刷新更改和分离实体。 – 2010-06-03 14:34:47