gpt4 book ai didi

java - 在 Grails 中保存大量数据时如何强制刷新数据库?

转载 作者:行者123 更新时间:2023-11-29 20:09:58 25 4
gpt4 key购买 nike

我创建了一个 Grails 应用程序,它通过 http(一次性导入)从 Google Storage 提取 300MB 的文本文件。该文本文件包含 35 000 000 个代码,需要存储到 MySQL 数据库中。

我创建了一个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();
}
}

注意

  1. sessionFactory.getCurrentSession().clear() 似乎没有执行任何操作
  2. flush:true 似乎没有做任何事情
  3. 我刚刚在服务中实现了一个自定义线程来完成这项工作。

最佳答案

自己设法解决了问题。对于那些感兴趣的人

使用无状态 hibernate session 并手动启动和提交事务:

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;

StatelessSession session = sessionFactory.openStatelessSession();
def tx = session.beginTransaction();

try {
List<ComingInHotCode> buffer = new ArrayList<>();
while((code = reader.readLine()) != null) {

if (i % 1000 == 0 && i > 0) {
// After every 1000 records commit and reopen a new.
tx.commit();
Thread.sleep(1000); // I just added this to give the GC a chance
tx = session.beginTransaction();
}

session.insert(new MyDomainObject([code: code, used: false, type: importType]));

i++;
}

tx.commit();
Thread.sleep(1000);

} catch (Exception ex) {
throw ex;
} finally {
reader.close();
stream.close();
session.close();
}
}

关于java - 在 Grails 中保存大量数据时如何强制刷新数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40201495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com