使用parallelstream中遇到的問題

com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:Lock wait timeout exceeded

使用parallelstream編列查詢的數(shù)據(jù)并新增數(shù)據(jù)的時(shí)候,數(shù)據(jù)庫報(bào)鎖等待超時(shí)

換成stream后不再報(bào)錯(cuò)

猜想:

1.Parallelstream并行操作是同步進(jìn)行的,所以會(huì)造成同一時(shí)間內(nèi)對(duì)數(shù)據(jù)庫的插入量過大

2.插入語句會(huì)短時(shí)間內(nèi)占有表鎖

3.同一個(gè)表插入數(shù)據(jù)太頻繁導(dǎo)致表占有鎖超時(shí)

正解:

1.parallelstream會(huì)并行執(zhí)行操作,并行操作不能確定執(zhí)行完成時(shí)間,可能會(huì)延緩事務(wù)提交速度,會(huì)引起數(shù)據(jù)庫事務(wù)鎖超時(shí)

2.開啟大量事務(wù)執(zhí)行會(huì)導(dǎo)致鎖占有超時(shí)

解決方法

方法一:不開啟事務(wù)

方法二:使用stream代替parallelstream

stream or parallelStream?

上面我們也看到了parallelStream所帶來的隱患和好處,那么,在從stream和parallelStream方法中進(jìn)行選擇時(shí),我們可以考慮以下幾個(gè)問題:

1.是否需要并行?

2.任務(wù)之間是否是獨(dú)立的?是否會(huì)引起任何競(jìng)態(tài)條件?

3.結(jié)果是否取決于任務(wù)的調(diào)用順序?

對(duì)于問題1,在回答這個(gè)問題之前,你需要弄清楚你要解決的問題是什么,數(shù)據(jù)量有多大,計(jì)算的特點(diǎn)是什么?并不是所有的問題都適合使用并發(fā)程序來求解,比如當(dāng)數(shù)據(jù)量不大時(shí),順序執(zhí)行往往比并行執(zhí)行更快。畢竟,準(zhǔn)備線程池和其它相關(guān)資源也是需要時(shí)間的。但是,當(dāng)任務(wù)涉及到I/O操作并且任務(wù)之間不互相依賴時(shí),那么并行化就是一個(gè)不錯(cuò)的選擇。通常而言,將這類程序并行化之后,執(zhí)行速度會(huì)提升好幾個(gè)等級(jí)。

對(duì)于問題2,如果任務(wù)之間是獨(dú)立的,并且代碼中不涉及到對(duì)同一個(gè)對(duì)象的某個(gè)狀態(tài)或者某個(gè)變量的更新操作,那么就表明代碼是可以被并行化的。

對(duì)于問題3,由于在并行環(huán)境中任務(wù)的執(zhí)行順序是不確定的,因此對(duì)于依賴于順序的任務(wù)而言,并行化也許不能給出正確的結(jié)果。

參考博客:深入淺出parallelStream

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容