我正在嘗試實現一個數組列表的lambda foreach 并行流,以提高現有應用程序的性能。到目前為止,沒有并行 Stream 的 foreach 迭代創建了寫入數據庫的預期數據量。但是當我切換到 parallelStream時,它總是將更少的行寫入數據庫。假設從預期的 10.000 行開始,將近 7000 行,但結果在這里有所不同。知道我在這里缺少什么,數據競爭條件,還是我必須使用鎖和同步?代碼基本上是這樣的:// Create Persons from an arraylist of dataarrayList.parallelStream() .filter(d -> d.personShouldBeCreated()) .forEach(d -> { // Create a Person // Fill it's properties // Update object, what writes it into a DB });到目前為止我嘗試過的事情將結果收集到一個新的列表中...collect(Collectors.toList())...然后遍歷新列表并執行第一個代碼片段中描述的邏輯。新的 'collected' ArrayList 的大小與預期結果相匹配,但最后在數據庫中創建的數據仍然較少。更新/解決方案:根據我標記的 關于該代碼中非線程安全部分的答案(以及注釋中的提示) ,我將其實現如下,最終給了我預期的數據量。性能有所提高,現在只需要之前實現的 1/3。StringBuffer sb = new StringBuffer();arrayList() .parallelStream() .filter(d-> d.toBeCreated()) .forEach(d -> sb.append( // Build an application specific XML for inserting or importing data ) );特定于應用程序的部分是基于 XML 的數據導入 api,但我認為這可以在普通的 SQL JDBC 插入中完成。
1 回答

HUH函數
TA貢獻1836條經驗 獲得超4個贊
lambda 中的代碼很可能不是線程安全的,因為代碼使用共享的非并發數據結構,或者它們的操作需要鎖定
我懷疑批量/批量插入會比并行版本更快,并行版本可能會以龐大的短期連接結束,這些連接會在它們之間競爭鎖定您正在插入的表。
也許您可以在并行編寫批量插入文件內容方面有所收獲,但這取決于如何通過您的數據庫 API 實現批量插入......是否需要先轉儲到文本文件中?在這種情況下,您的并行流可以并行組成該文本的不同行,最后將它們加入文本文件以加載到數據庫中。也許它允許您在內存中使用語句對象的集合/列表而不是文本文件,在這種情況下,您并行流可以并行創建這些對象并將它們收集到最終的集合/列表中以批量插入到您的數據庫中.
添加回答
舉報
0/150
提交
取消