您的位置:首页 > 其它

LearningLog.PK的选择及ID的产生机制

2007-11-29 08:19 447 查看
<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++;


 }


}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息