数据库有很多种,例如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
分享到:
相关推荐
9. **生成器**:Python的生成器允许在运行时动态生成序列,节省内存且便于处理大量数据。 10. **装饰器**:装饰器是一种特殊类型的函数,可以修改其他函数的功能或行为,是Python中强大的工具。 通过《易学Python...
设计模式是解决常见编程问题的经验总结,Python中同样可以应用各种设计模式,如工厂模式、单例模式、装饰器模式等,以提高代码的可读性和可维护性。 【更可爱的yield】 yield是Python生成器的关键字,它允许创建...
总结,新浪短网址生成器结合易语言的易学性和强大功能,为网络编程爱好者提供了一个实践和学习的平台。通过理解其工作原理,我们可以进一步了解网络通信、哈希算法以及API接口的使用,同时也可加深对易语言编程的...
### ZEMAX光学设计教程知识点概述 #### 一、ZEMAX软件介绍 - **开发者与历史**: ZEMAX由ZEMAX公司...通过掌握序列描光和非序列描光两种不同的模拟模式,用户可以根据具体需求选择最合适的方法来进行光学设计工作。
1. **设计模式**:源码可能包含了常见的设计模式实现,如单例、工厂、观察者等,这些都是编写可维护和可扩展代码的关键。 2. **错误处理与调试**:查看源码可以了解如何有效地处理错误和异常,以及如何使用调试工具...
在VB编程中,可以使用数组来存储字符序列,通过随机数生成器来选取字符。同时,利用条件语句判断用户的输入是否正确,并更新正确率和计时数据。最后,通过更新界面控件的文本属性来显示相关信息。 这个“打字排练...
8. **设计模式**:单例模式、工厂模式、装饰器模式等,考察你的面向对象编程思维。 9. **系统设计**:设计大规模系统架构,考察你的分布式系统知识和问题解决能力。 通过"python-algorithm-master",你不仅可以...
- **Struts2**:Struts2是MVC(模型-视图-控制器)设计模式的实现,负责处理HTTP请求,将数据传递给模型并渲染视图。它为Web应用提供了一种组织架构,便于开发和维护。 - **Hibernate**:Hibernate是一个ORM...
原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR ... 11.10.2 加强的生成器特性 11.11 练习 第12章 模块 12.1 什么是模块 12.2 模块和文件 12.2.1 模块名称...
原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR ... 11.10.2 加强的生成器特性 11.11 练习 第12章 模块 12.1 什么是模块 12.2 模块和文件 12.2.1 模块名称...
51单片机,作为微控制器领域的一款经典产品,因其易学易用、功能强大而被广泛应用于各种电子项目中。本篇文章将深入探讨一个基于51单片机的电子琴程序,该程序是针对德飞莱开发板设计的课程设计作业,旨在帮助读者...
- **生成器表达式**:更简洁地创建生成器。 #### 十、标准库概览 - **操作系统接口**:与操作系统交互。 - **文件通配符**:处理文件名匹配。 - **命令行参数**:读取命令行输入。 - **错误输出重定向和程序终止**...
1. 方块生成:随机生成不同形状的方块序列。 2. 方块移动:控制方块在屏幕上的水平移动。 3. 方块旋转:实现方块90度的顺时针或逆时针旋转。 4. 方块下落:模拟重力效应,使方块自动下落。 5. 碰撞检测:判断方块与...
5. **生成器**:通过yield关键字创建生成器,实现惰性计算和内存优化。 **Python3标准库** Python3的标准库非常庞大,其中一些重要的模块包括: - **os**:提供与操作系统交互的接口,如文件和目录操作。 - **sys...
11.10.2 加强的生成器特性 11.11 练习 第12章 模块 12.1 什么是模块 12.2 模块和文件 12.2.1 模块名称空间 12.2.2 搜索路径和路径搜索 12.3 名称空间 12.3.1 名称空间与...
对于每一行代码,解释器都会生成相应的指令序列,并直接在内存中执行。 5. 错误处理:解释器需要有强大的错误处理机制,以便在源代码存在错误时能及时发现并给出友好的错误信息。 四、源码学习价值 通过研究OB190...
至于【压缩包子文件的文件名称列表】中的"132675167875231308",这看起来像一个随机生成的数字序列,可能是为了保护源码的安全而命名的,通常在解压后会看到更详细的文件结构和名称,包括控制器、模型、视图、配置...
在电子技术领域,51单片机是一种广泛应用的微控制器,尤其在教学和入门级项目中,它因为其简单易学、资源丰富而备受青睐。本项目“基于51的8*8LED灯的扫描显示程序”就是这样一个典型实例,旨在帮助初学者理解并实践...
Python中的类支持继承,私有变量,以及迭代器和生成器的概念。异常本身也可以被看作是一种特殊的类。 Python的标准库为开发者提供了许多实用的功能,涵盖了操作系统接口、文件通配符、命令行参数处理、数学运算、...