DefaultIdentifierGenerator 雪花演算法 生成 重複 id 解決辦法
前言
利用 mybatisplus 的 DefaultIdentifierGenerator 生成 id 當做主鍵,人家的程式碼沒有問題,是自己程式程式碼問題導致。
問題發生
利用 mybatisplus 的 DefaultIdentifierGenerator 生成 id 當做主鍵,然後批量新增資料後,丫的報錯了
BatchUpdateException: Duplicate entry '1331426208168046594' for key 'PRIMARY'"
主鍵衝突!!!!
可是建立的 id 是用方法生成了啊 (ノへ ̄、)
private Number createId() {
IdentifierGenerator identifierGenerator = new DefaultIdentifierGenerator();
return identifierGenerator.nextId(new Object());
}
排查原因
接下來就是排查原因了,首先看一下它原始碼是怎麼生成資料的。
首先看到了鎖,java 在jdk1.6之後優化了 synchronized ,使得它不會是直接變成重量級鎖,所以呼叫此方法並不會有併發問題,且對同一毫秒的判斷序列號也自增了,理論上並不會出現重複id的情況。
觀察一遍發現問題所在。
它的 時間判斷引數是一個成員變數,生命週期跟著 當前類走。
而呼叫的方法並不是個單例模式,所以每次新建一個物件,其內部判定的時間判斷引數都是獨立存在的,這樣的話在並行程式的過程中,是有可能生成相同的id的。恰好發生問題的辦法用了 java 的 stream ,既然問題定位到了,接下來要做的就是修改它。
問題解決
有兩種解決辦法。
- java 的 stream 預設 是 並行流,我們可以將它設定成序列流 ,例如
加上 sequential() 將其變成序列流。
- 寫一個 IdentifierGenerator util ,既然 DefaultIdentifierGenerator 的 Sequence 不是單例,那麼我們就在外層做操作,把呼叫到的 IdentifierGenerator 變成單例。
相關文章
- RCmongodb出現id重複問題的簡單解決辦法jztMongoDB
- jQuery裡的silidetoggle方法不停重複動畫效果的解決辦法jQueryIDE動畫
- 分散式唯一ID解決方案-雪花演算法分散式演算法
- 開源一個比雪花演算法更好用的ID生成演算法(雪花漂移)演算法
- YII GET方式引數重複/疊加的解決辦法
- 雪花演算法ID在前端丟失精度解決方案演算法前端
- 基於雪花演算法的 PHP ID 生成器演算法PHP
- 基於雪花演算法生成分散式ID(Java版)演算法分散式Java
- android ExceptionInInitializerError解決辦法AndroidExceptionError
- 雪花演算法及微服務叢集唯一ID解決方案演算法微服務
- 在Android裝置上使用極光推送id重複的原因分析和解決辦法Android
- Windows.h與WinSock2.h重複定義解決辦法Windows
- [轉載]防止JAVA程式重複啟動的一個另類解決辦法Java
- Java使用雪花演算法實現生成全域性唯一idJava演算法
- IDEA 找不到包解決辦法Idea
- 快速解決mongodb出現id重複問題MongoDB
- 解決textDidChange每次都重複發請求
- 完美解決方案-雪花演算法ID到前端之後精度丟失問題演算法前端
- Xamarin Android SDK無法更新的解決辦法Android
- AJAX防重複提交的辦法總結
- 字串本身重複字元的檢查辦法字串字元
- Ubuntu 重啟無法進入圖形介面的解決辦法Ubuntu
- Idea編譯錯誤解決辦法Idea編譯
- 分散式雪花演算法獲取id分散式演算法
- JqueryQrcode生成二維碼不支援中文的解決辦法jQuery
- IDEA+Maven:invalid bound statement (not found)解決辦法IdeaMaven
- 雪花演算法演算法
- flutter防止widget rebuild終極解決辦法FlutterRebuild
- android RelativeLayout 內容居中解決辦法:Android
- idea Git Force Checkout後的解決辦法IdeaGit
- nvidia安裝程式無法繼續的解決辦法
- github慢解決辦法Github
- Grub Rescue解決辦法
- /dev/null解決辦法devNull
- MSBuild Tools解決辦法UI
- iOS新建推送證書無法生成p12檔案的解決辦法iOS
- oracle 11g awr不自動生成的臨時解決辦法Oracle
- 人人生成器test類的按鈕消失解決辦法