在将大量实体插入数据库时,我遇到了一些奇怪的行为。我从0.5GB StAX解析的XML文件(包含我感兴趣的大约35000个实体)中获取内容,将每个JAXb绑定对象传递给EJB,并将其插入到postgres db中。到现在为止还挺好。前1000个实体每个持续约80毫秒。当它总共达到3000个实体时,它会多一点,每个约100毫秒。还行。但是当我超过7000时,问题就开始了。突然之间,一些实体所花费的时间比其他实体多20倍,因此例如一个持续150ms,另一个持续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。
我很感激并感谢任何有关为何发生这种情况以及如何摆脱它的建议。