亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

lambda foreach parallelStream 創建的數據少于預期

lambda foreach parallelStream 創建的數據少于預期

Cats萌萌 2022-05-25 10:48:09
我正在嘗試實現一個數組列表的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 實現批量插入......是否需要先轉儲到文本文件中?在這種情況下,您的并行流可以并行組成該文本的不同行,最后將它們加入文本文件以加載到數據庫中。也許它允許您在內存中使用語句對象的集合/列表而不是文本文件,在這種情況下,您并行流可以并行創建這些對象并將它們收集到最終的集合/列表中以批量插入到您的數據庫中.


查看完整回答
反對 回復 2022-05-25
  • 1 回答
  • 0 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號