0

在将大量实体插入数据库时​​,我遇到了一些奇怪的行为。我从 0.5GB StAX 解析的 XML 文件中获取内容(包含大约 35000 个我感兴趣的实体),将每个 JAXb 绑定对象传递给 EJB,EJB 将其插入到 postgres 数据库中。到目前为止,一切都很好。前 1000 个实体平均保持大约 80 毫秒。当它总共达到 3000 个实体时,它会多一点,每个实体大约 100 毫秒。还可以。但是当我超过 7000 时,问题就开始了。突然之间,一些实体所花费的时间大约是其他实体的 20 倍,例如,一个实体持续 150 毫秒,另一个实体持续 3 秒。问题显然不在于 XML 文件中输入对象的大小,它们几乎相等。

我的第一个想法是关于刷新和清除 EntityManager,所以我编写了这个原始代码:

if(++updateCounter % 25 == 0) {
    dao.flushAndClearContext();
    logger.info("Flushing and clearing persistance context.");
}

DAO:
public void flushAndClearContext() {
    entityManager.flush();
    entityManager.clear();
}

这没有帮助。接下来,出于好奇,我将大 XML 复制到 5 个较小的文件中(一个文件中大约有 7000 个条目),并尝试一个接一个地填充我的数据库,它有点工作。我可以在合理的时间内用所有数据填充数据库。但是问题仍然存在,当我坚持大数字时,我仍然会出现奇怪的行为,只是规模较小,这绝对不是我的解决方案。

我正在使用 eclipselink 和 postgres,AS 是 glassfish v3。

我将不胜感激并感谢任何建议为什么会发生这种情况以及如何摆脱它。

4

0 回答 0