Java执行程序服务-内存不足



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

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条记录,如果没有可用的记录,它将返回一个空数组。类IndexdataToTargetDBThread实现了Runnable。它将给定的文档索引到目标数据库。

当运行上述函数时,会出现"内存不足"异常。Source DB有近1M条记录,因此while循环被处理了大约2000次。在处理了大约700次之后,出现了内存不足,整个DB传输过程失败。有什么有效的方法来处理这个问题吗?

我看到两个问题。首先,它是从数据库中提取的不受限制的数据大小。您可以限制应用程序中同时存在的记录数。创建缓冲区(它可以是一个具有有限元素的队列(,并在准备好写入后刷新批:https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html)

第二:不确定数据库的隔离级别。下一篇文章描述了PostgreSQL中并发插入的一些问题:https://www.postgresql.org/files/developer/concurrency.pdf

此外,您可以尝试通过-Xmx..来增加java内存限制。。选项:增加Java 中的堆大小

但这不是最好的方法:(

最新更新