簡體   English   中英

Java 執行器服務 - 超出 Memory

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM