<FROM Java Database Best Practise>
作爲PK的欄位不宜帶有實際意義,建議使用整數作爲PK。一方面是爲系統可擴展性考慮,因爲若PK欄位帶有意義,則作爲PK的欄位有可能因系統邏輯變化而發生變化,從而給資料一致帶來風險。另一方面也是爲效能考慮,使用整數PK可進行快速檢索,而涉及多個欄位則會在處理時佔用較多資源。
建議自行實現產生整數ID的機制,而不要依賴於DB的Sequence。可有一table SEQUENCE,定義以下欄位
NAME //sequence 名稱
SEED //sequence計數基數
SEQ //sequence計數值
產生sequence的類Sequencer
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++;
}
}