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++;
}
}
作为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++;
}
}
相关文章推荐
- JBPM源码分析(一)---数据库表主键ID的产生机制
- shark中的各个id的产生机制
- jsessionid的产生机制
- 基于局部学习的特征选择:Local-Learning-Based Feature Selecti
- 网站的缓存机制的选择和应用
- oracle的SequenceGenerator为主键Id自动产生的序列号不是按顺序生成的解决办法
- Android LOG机制流程图
- [转载]基于效率考虑,对Windows多线程同步机制的选择,分析与实测
- Android的log机制小结
- 利用Random类产生10个[10,99]之间的随机数,并将这10个随机数在列表框中显示出来,每个数占一项。用户选择某项后,在右边标签中显示所选内容。
- 金蝶BOS 获取列表界面所选择的行数的ID
- 深入理解log机制
- BGP发布路由和选择路由的机制
- 微信公众平台 获取用户基本信息(UnionID机制)
- EBS并发请求产生的log和out文件定位及清理
- Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible. <class 'sqlalchemy.exc.OperationalError'> (HTTP 500) (Request-ID: req-6ac88345-ce5a
- 利用Log parse 分析Exchange 性能并产生相应报表!(1)-Protocol 协议 Log!(2)
- Oracle Redo Log 机制 小结
- hibernate generator class="" id生成机制
- 对checkBox做选择判断时,请求需要传递id