数据库有很多种,例如Oracle,DB2,Sybase,MySql,SQL Server等等,他们有的提供主键生成,有的不提供,提供的方式也不一样,如果有的系统需要同时支持多种数据库,就要求主键生成更有通用性,下面就给出解决方案。
使用表存储,表有两个列,一个存放键名,一个存放键值
取值时先更新数据库键值+20;然后查询出增加后的值,例如我们更新后的值是1000,每次增加20,现在可用的key = 1000 -20 +1 = 981;这样做的好处就是缓存主键,不用增加一个就修改,查询一次数据库,我们增加20次才查询一次数据库。
public class KeyGenerator {
private static Map keygens = new HashMap(10);
private static final int POOL_SIZE = 20;
private KeyInfo keyinfo;
private KeyGenerator(){}
private KeyGenerator(String keyName) {
keyinfo = new KeyInfo(POOL_SIZE, keyName);
}
public static synchronized KeyGenerator getInstance(String keyName) {
KeyGenerator keygen;
if(keygens.containsKey(keyName)) {
keygen = (KeyGenerator)keygens.get(keyName);
} else {
keygen = new KeyGenerator(keyName);
keygens.put(keyName, keygen);
}
return keygen;
}
public synchronized int getNextKey() {
return keyinfo.getnextKey();
}
}
public class KeyInfo {
private int keyMax;
private int keyMin;
private int nextKey;
private int poolSize;
private String keyName;
public KeyInfo(int poolSize, String keyName) {
this.poolSize = poolSize;
this.keyName = keyName;
retrieveFromDB();
}
public int getKeyMax() {
return keyMax;
}
public int getKeyMin() {
return keyMin;
}
public int getnextKey() {
if(nextKey > keyMax) {
retrieveFromDB();
}
return nextKey++;
}
private void retrieveFromDB() {
String updateSql = "UPDATE KEYTABLE SET KEYVALUE = KEYVALUE + "
+ poolSize + "where keyname = '" + keyName +"'";
String selectSql = "select keyvalue from keytable where keyname = '"
+ keyName +"'";
//execute the above queries in a transaction and commit it
//assume the value returned is 1000
int keyFromDB = 1000;
keyMax = keyFromDB;
keyMin = keyFromDB - poolSize + 1;
nextKey = keyMin;
}
}
public class Client {
public static void main(String[] args) {
KeyGenerator keygen = KeyGenerator.getInstance("PO_NUMBER");
for(int i=0; i < 20; i++) {
System.out.println("key(" + (i+1)+")=" +keygen.getNextKey());
}
}
}
输出结果:
key(1)=981
key(2)=982
key(3)=983
key(4)=984
key(5)=985
key(6)=986
key(7)=987
key(8)=988
key(9)=989
key(10)=990
key(11)=991
key(12)=992
key(13)=993
key(14)=994
key(15)=995
key(16)=996
key(17)=997
key(18)=998
key(19)=999
key(20)=1000
- 大小: 23.7 KB
分享到:
相关推荐
易学设计模式,本书采用轻松诙谐的语气讲述了23种常用的设计模式,书籍格式为pdg格式
《Java易学设计模式》全书的随书源码,每一个章节一个压缩包,分别为:工厂模式、命令模式、组合模式、模板方法模式、工厂方法模式例子、状态模式例子、迭代器模式、解释器模式、享元模式、桥模式、装饰模式、代理...
易学设计模式的随书光盘,源代码. 上手更容易
易学_设计模式_郭志学 易学_设计模式_郭志学
《易学 设计模式》 郭志学 编著 随书源代码 ☆ 章节清单:☆ 第01章 欲速则不达:了解设计模式 第02章 磨刀不误砍柴工:UML语言概述 第03章 术业有专攻:简单工厂模式 (SimpleFactory) 第04章 精益求精:工厂方法...
Java《易学设计模式》随书源代码,书中介绍了多种JAva模式的方法和使用,比如简单工厂模式、工厂方法模式例子、状态模式例子、迭代器模式、解释器模式、命令模式、模板方法模式、享元模式、桥模式、代理模式、适配器...
易学设计模式源代码 很实用的。。。。。。。。。。
是《易学设计模式》一书的源码。用JAVA实现。拿出来与大家分享。
设计模式例子文档,简单易学。从中可以对各种模式有详细的了解
一个简单易学的二维码生成Demo。方便大家学习如何去做二维码生成器!
摘要:Java源码,书籍源码,随书源码,设计模式,Java电子书 运行环境:Java/Eclipse
库索族二维码生成器可以生成多种类型的二维码,包括文本二维码、网址二维码、名片二维码、电话二维码、短信二维码和wifi网络二维码,本软件界面简洁、操作方便、易学易用。 库索族二维码生成器功能: 文本二维码:...
通过生动有趣的图解的方式,来展现每一个设计模式的原理,以及简单的实现案例,非常易学易懂,非常适合想要学习设计模式的童鞋。
基于WEB的C#程序生成器,供学习参考使用,简单易学易用。
C#设计模式之Decorator 装饰模式,pdf+视频教学,实例演示,易学易用~~
Java书籍 ,设计模式,搞笑版容易理解,学习简单,易学易用
资源比较大,只好分来传输,否则传不上去。设计模式中的经典书籍,强烈建议看这本书来学习设计模式。gof的设计模式太抽象了,这本书非常易学。
是一款最新的,简而易学的随机数生成器!统计学的朋友,你值得拥有!
设计模式之观察者模式,简单易学,便于理解。