LearningLog.PK的選擇及ID的產生機制

<FROM Java Database Best Practise>

    作爲PK的欄位不宜帶有實際意義,建議使用整數作爲PK。一方面是爲系統可擴展性考慮,因爲若PK欄位帶有意義,則作爲PK的欄位有可能因系統邏輯變化而發生變化,從而給資料一致帶來風險。另一方面也是爲效能考慮,使用整數PK可進行快速檢索,而涉及多個欄位則會在處理時佔用較多資源。

建議自行實現產生整數ID的機制,而不要依賴於DB的Sequence。可有一table SEQUENCE,定義以下欄位

NAME  //sequence 名稱
SEED //sequence計數基數
SEQ  //sequence計數值

產生sequence的類Sequencer

package ee.seq;

import java.util.*;

public class Sequencer {
 
private static final long MAX_KEYS = 1000000L;
 
private static final HashMap sequencers = new HashMap();
 
 
private String name = null;
 
private long seed = -1L;
 
private long sequence = 0L;
 
 
public static final Sequencer getInstance(String name){
  Sequencer seq 
= null;
  
synchronized(sequencers){
   
if(sequencers.containsKey(name)){
    seq 
= (Sequencer)sequencers.get(name);
   }

   
else{
    seq 
= new Sequencer(name);
    sequencers.put(name, seq);
   }

  }

  
return seq;
 }

 
 
private Sequencer(String seqName){
  name 
= seqName;
 }

 
 
public synchronized long next(){
  
if(seed==-1 || sequence+1 >= MAX_KEYS){
   reseed();
  }

  sequence
++;
  
return (seed * MAX_KEYS + sequence);  
 }

 
 
private void reseed(){
  seed
++;
 }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章