OpenJPA,大量插入的内存开销

时间:2014-06-29 06:58:13

标签: jpa garbage-collection openjpa

基本上我在巨大的数据集上创建了一种图形。我在内存中保留了一堆节点,然后我迭代地加载另一堆节点来创建将它们与前一个节点连接起来的边缘,然后我改变那些保留在内存中的节点等等。

类似java的伪代码可能是这样的:

while(externalIterator.hasNext()) {
  Set<Node> bunch1 = externalIterator.next();
  em.getTransaction().begin();
  internalIterator = nodeBunchList.iterator();
  while(internalIterator.hasNext()) {
    Set<Node> bunch2 = internalIterator.next();
    computesEdges(bunch1, bunch2);
  }
  em.getTransaction().commit();
}

问题是:

  1. computesEdges会执行大量的插入操作,这些插入操作不应由EntityManager缓存或保存在内存中。现在,偶尔,我做em.clear()。它确实有效,但它花费了不可思议的时间来进行垃圾收集。
  2. 来自第二个迭代器的节点也不应该保存在内存中,因为它们只使用一次。
  3. 我想知道是否有办法告诉实体经理不要记住所有这些事情,但是一旦我不再使用它就要摆脱它们。

1 个答案:

答案 0 :(得分:0)

  

我想知道是否有办法向实体经理说不要   记住所有这些事情,但要尽快摆脱它们   不要再使用它了。

调用EntityManager.clear()告诉JPA清除持久性上下文是安全的。如果要对数据库进行任何更改,则始终需要调用EntityManager.flush(),以便将更改刷新到db。

要提高EntityManager.clear()调用的速度,请尝试启用OpenJPA的LiteAutoDetach功能。

<property name="openjpa.DetachState" value="loaded(LiteAutoDetach=true)"/>