我創建了一個Grails應用程序,通過http(一次導入)從Google存儲中提取一個300MB的文本文件。該文本文件包含需要存儲到MySQL數據庫中的35 000 000個代碼。如何在Grails中保存大量數據時強制刷新數據庫?
我創建了一個Thread
,它通過傳入的InputStream
循環,創建一個域對象列表,將它們加載到Array
中,並每隔100次迭代批量保存一次該數組。
該過程需要幾小時才能完成(這是可以的)。問題在於,在查詢表格時,我看不到保存單個記錄。它被緩存或緩存在某處,似乎正在等待該過程完成 - 這正是我不想要的!
代碼片斷
synchronized processImport (String url, String importType) throws RuntimeException {
InputStream stream = new URL(url).openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
String code;
int i = 0;
try {
List<ComingInHotCode> buffer = new ArrayList<>();
while((code = reader.readLine()) != null) {
try {
buffer.add(new CodeDomainObject([code: code, used: false, type: importType]));
if (i % 100 == 0) {
CodeDomainObject.saveAll(buffer);
buffer.clear();
}
} catch (Exception ex) {
println ("Save error:" + ex.getMessage())
}
i++;
}
CodeDomainObject.saveAll(buffer);
} catch (Exception ex) {
throw ex;
} finally {
reader.close();
stream.close();
}
}
注意
sessionFactory.getCurrentSession().clear()
似乎並沒有做任何事情flush:true
似乎並沒有做任何事情- 我剛在服務中實現了一個自定義線程來完成這個任務工作。