業務unique id的生產策略分析
需求上下文:
業務是和單個user相關的(userid),業務表分到10個db host中
需求:高併發下生產唯一的業務id
每個db host上有乙個業務seq, 這個seq自增步長是10,然後每個host起點不一樣, 0 是0, 1是1,這樣每個 db host生成的seq資料就不會衝突(host1上只會生產尾數為1的seq,host2上只會生產尾數為2的seq,類推)
具體生產seq的oracle sql為:
select business_id_seq_0.nextval from dual //生成乙個
select business_id_seq_0.nextval from dual connect by level <= 100 //生成100個
查詢的時候每次seq生成100個,快取到本地記憶體中的佇列(concurrentlinkedqueue), 下次就從記憶體中取了
但這個code中的synchronized鎖加的很奇怪, concurrentlinkedqueue是在鎖的**塊內部使用的, 但如果上下文環境是安全的,concurrentlinkedqueue這個高併發佇列不就沒意義了嗎,
個人覺得加鎖應該只加在從資料庫拿100個seq的時候加,防止多個執行緒同時去資料庫建立100個seq,導致重複建立。在那之外的獲取seq其實不用加鎖的,因為concurrentlinkedqueue已經是執行緒安全。
主鍵生成策略
一共是13種,其中包括native native 對於 oracle 採用 sequence 方式,對於mysql 和 sql server 採用identity 自增主鍵生成機制 native就是將主鍵的生成工作交由資料庫完成,hibernate不管 很常用 uuid 採用128位的uuid演算法...
主鍵生成策略
原文 generatedvalue,jpa通用策略生成器 jpa提供的四種標準用法為table,sequence,identity,auto.table 使用乙個特定的資料庫 來儲存主鍵。sequence 根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。id generatedvalue st...
主鍵生成策略
1 自動增長identity 適用於mysql db2 ms sql server,採用資料庫生成的主鍵,用於為long short int型別生成唯一標識 使用sql server 和 mysql 的自增欄位,這個方法不能放到 oracle 中,oracle 不支援自增字段,要設定sequence...