Loj*_*Ibg 1 grails batch-processing
我正在处理一个大型的csv文件,我发现这篇关于批量导入的文章:http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/.我试图做同样的事,但似乎没有效果.
每次刷新后,实例是否可以在数据库中查看?因为当我尝试查询'SELECT COUNT(*)FROM TABLE1'时,现在有0或所有entites,所以它看起来像是一次提交所有实例.
然后我还注意到,当第一次导入到空白表时,导入工作很快,但是当表已满并且实体应该更新或保存为新实体时,整个过程非常慢.这主要是因为内存没有被清理,减少到1MB或更少,应用程序卡住了.那是因为没有刷新会话?
我的导入代码在这里:
public void saveAll(List<MedicalInstrument> listMedicalInstruments) {
log.info("start saving")
for (int i = 0; i < listMedicalInstruments.size() - 1; i++) {
def medicalInstrument = listMedicalInstruments.get(i)
def persistedMedicalInstrument = MedicalInstrument.findByCode(medicalInstrument.code)
if (persistedMedicalInstrument) {
persistedMedicalInstrument.properties = medicalInstrument.properties
persistedMedicalInstrument.save()
} else {
medicalInstrument.save()
}
if ((i + 1) % 100 == 0) {
cleanUpGorm()
if ((i + 1) % 1000 == 0) {
log.info("saved ${i} entities")
}
}
}
cleanUpGorm()
}
protected void cleanUpGorm() {
log.info("cleanin GORM")
def session = sessionFactory.currentSession
session.flush()
session.clear()
propertyInstanceMap.get().clear()
}
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助!
问候,
Lojza
PS:我的JVM内存总共有252.81 MB,但它只是我和其他3个人的测试环境.
小智 6
我有一次类似的问题.然后我意识到原因是因为我在grails服务中这样做,默认情况下是事务性的.因此,对服务中的方法的每次调用本身都包含在一个事务中,该事务使得对该数据库的更改一直存在,直到该方法完成,在这种情况下结果不会被刷新.
| 归档时间: |
|
| 查看次数: |
1422 次 |
| 最近记录: |