簡體   English   中英

多線程文件處理和數據庫批處理插入

[英]Multi-threaded file processing and database batch insertions

我有一個Java主應用程序,它將逐行讀取文件。 每行代表訂戶數據。

name, email, mobile, ...

為要處理的每一行創建一個訂戶對象,然后使用JDBC將其保留在數據庫中。

PS:輸入文件包含大約1500萬訂戶數據,處理應用程序大約需要10-12個小時。 我需要將其減少到2-3小時左右,因為此任務是一項遷移活動,而停機時間大約是4-5小時。

我知道我需要使用多個線程/線程池可能是Java的本機ExecuterService。 但是我也被要求做一個批量更新。 假設采用50個或100個工作線程的線程池,以及500-1000個訂閱者的批量更新。

我對ExecuterService很熟悉,但沒有找到一種可以在其中添加批處理更新邏輯的方法。

我的整體應用程序代碼如下:

while (null != (line = getNextLine())) {
    Subscriber sub = getSub(line); // creates subscriber object by parsing the line
    persistSub(sub); // JDBC - PreparedStatement insert query executed
}

需要知道一種方法,在該方法中我可以使用多個線程並使用批處理更新或可用於此類情況的任何現有框架或Java API來更快地處理它。

persistSub(sub)不應立即訪問數據庫。 相反,它應該將sub存儲在長度為500-1000的數組中,並且僅在該數組已滿或輸入文件終止時才將其包裝在Runnable並提交到線程池。 然后, Runnable通過jdbc訪問數據庫,就像在JDBC Batching with PrepareStatement Object中描述的那樣。

更新

如果寫入數據庫的速度很慢並且輸入文件的讀取速度很快,則可以創建許多包含數據的陣列,等待寫入數據庫,並且系統可能會用盡內存。 因此, persistSub(sub)應該跟蹤分配的數組數。 最簡單的方法是使用允許數量的數組進行信號量化的信號量 在分配新數組之前, persistSub(sub)創建Semaphore.aquire() 每個Runnable任務在結束之前都會生成Semaphore.release()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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