gpt4 book ai didi

Java Executor 服务 - 内存不足

转载 作者:行者123 更新时间:2023-12-04 07:54:11 24 4
gpt4 key购买 nike

我正在使用 java executor 服务将数据从一个数据库传输到另一个数据库。

ExecutorService executor = (ExecutorService) Executors.newFixedThreadPool(10);
一旦执行器服务被初始化。以 500 条为一组从源数据库中检索记录,并将这些记录索引到目标数据库中。
while(true){  
List<?> docs = getDataFromSourceDB();
if(docs.size > 0){
IndexdataToTargetDBThread thread = new IndexdataToTargetDBThread(docs)
executor.submit(thread);
}else{
break;
}
}

executor.shutdown()
while (!eService.isTerminated()) {
}
函数 getDataFromSourceDB()每次调用返回 500 条记录,如果没有可用记录,它将返回一个空数组。类(class) IndexdataToTargetDBThread实现 Runnable。它将给定的文档索引到目标数据库。
运行上述函数时出现 Out Of Memory 异常。源数据库有接近 100 万条记录,因此 while 循环被处理了大约 2000 次。在处理大约 700 次内存不足后,整个数据库传输过程失败。有没有什么有效的方法来处理这个问题?

最佳答案

我看到两个问题。
首先,它是从数据库中获取的无限数据大小。您可以限制应用程序中同时存在的记录数。创建缓冲区(它可能是一个元素有限的队列)并在准备好写入后刷新批处理:https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html )
第二:不确定数据库的隔离级别。下一篇文章描述了PostgreSQL并发插入的一些问题:https://www.postgresql.org/files/developer/concurrency.pdf
此外,您可以尝试通过 -Xmx .. 选项增加 java 内存限制:
Increase heap size in Java
但这不是最好的方法:)

关于Java Executor 服务 - 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66793701/

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