[英]Java Executor Service - Out Of Memory
我正在使用 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()) {
}
function getDataFromSourceDB()
在每次調用時返回 500 條記錄,如果沒有可用記錄,它將返回一個空數組。 class IndexdataToTargetDBThread
實現 Runnable。 它將給定文檔索引到目標數據庫。
運行上述 function 時會出現 Out Of Memory 異常。 Source DB 有接近 1M 的記錄,因此 while 循環被處理了大約 2000 次。 在 memory 處理大約 700 次后,整個 DB 傳輸過程失敗。 有沒有有效的方法來處理這個?
我看到兩個問題。 首先,它是從 DB 獲取的無限數據大小。 您可以限制應用程序中同時存在的記錄數。 創建緩沖區(它可能是一個元素有限的隊列)並在准備好寫入后刷新批處理: https://docs.oracle.com/javase/8/docs/api/java/util/Queue.ZFC35FDC70D8269D25698888 )
第二:不確定數據庫的隔離級別。 The next article describes some issues with concurrent insert in PostgreSQL: https://www.postgresql.org/files/developer/concurrency.pdf
此外,您可以嘗試通過 -Xmx.. 選項增加 java memory 限制: 增加 Java 中的堆大小
但這不是最好的方法:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.