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
- 分散式唯一ID解決方案-雪花演算法分散式演算法
- 雪花演算法ID在前端丟失精度解決方案演算法前端
- 開源一個比雪花演算法更好用的ID生成演算法(雪花漂移)演算法
- 基於雪花演算法的 PHP ID 生成器演算法PHP
- 基於雪花演算法生成分散式ID(Java版)演算法分散式Java
- 雪花演算法及微服務叢集唯一ID解決方案演算法微服務
- 快速解決mongodb出現id重複問題MongoDB
- 在Android裝置上使用極光推送id重複的原因分析和解決辦法Android
- Java使用雪花演算法實現生成全域性唯一idJava演算法
- 分散式雪花演算法獲取id分散式演算法
- 完美解決方案-雪花演算法ID到前端之後精度丟失問題演算法前端
- jQuery裡的silidetoggle方法不停重複動畫效果的解決辦法jQueryIDE動畫
- 分散式唯一ID生成方案選型!詳細解析雪花演算法Snowflake分散式演算法
- ShardingSphere-proxy-5.0.0分散式雪花ID生成(三)分散式
- Field ‘spu_id‘ doesn‘t have a default valu 解決辦法
- Apple ID已被鎖定或停用解決辦法 Apple ID已被停用怎麼解除APP
- ACCESS 模擬雪花ID
- 雪花演算法【分散式ID問題】【劉新宇】演算法分散式
- 全域性唯一ID生成常見的幾種方式和twitter/snowflake(雪花演算法)解析演算法
- 如何在Java服務中實現分散式ID生成:雪花演算法與UUID的對比Java分散式演算法UI
- Ubuntu 重啟無法進入圖形介面的解決辦法Ubuntu
- Golang雜談-gorm整合雪花idGolangORM
- Twitter的分散式雪花演算法 SnowFlake 每秒自增生成26個萬個可排序的ID (Java版)分散式演算法排序Java
- HTML id屬性值不能重複HTML
- 刪除重複id的記錄
- 短影片開源原始碼,報錯資訊顯示ID重複的解決方案原始碼
- 分散式 ID 生成演算法 — SnowFlake分散式演算法
- github慢解決辦法Github
- Namespoace Terminating 解決辦法
- 雪花演算法演算法
- oracle 11g awr不自動生成的臨時解決辦法Oracle
- 人人生成器test類的按鈕消失解決辦法
- 分散式系統全域性唯一Id(SnowFlake)雪花演算法實現分散式演算法
- 分散式ID生成器的解決方案總結分散式
- 檔案無法粉碎解決辦法
- 公寓噪音的解決辦法
- height:100%失效解決辦法