`

易学设计模式十 单例序列键生成器

阅读更多
数据库有很多种,例如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
分享到:
评论

相关推荐

    易学Python高清_python_pool5bd_

    9. **生成器**:Python的生成器允许在运行时动态生成序列,节省内存且便于处理大量数据。 10. **装饰器**:装饰器是一种特殊类型的函数,可以修改其他函数的功能或行为,是Python中强大的工具。 通过《易学Python...

    华为出品-Python基础入门教程-可爱的Python 共86页.ppt

    设计模式是解决常见编程问题的经验总结,Python中同样可以应用各种设计模式,如工厂模式、单例模式、装饰器模式等,以提高代码的可读性和可维护性。 【更可爱的yield】 yield是Python生成器的关键字,它允许创建...

    新浪短网址生成器-易语言

    总结,新浪短网址生成器结合易语言的易学性和强大功能,为网络编程爱好者提供了一个实践和学习的平台。通过理解其工作原理,我们可以进一步了解网络通信、哈希算法以及API接口的使用,同时也可加深对易语言编程的...

    zemax光学设计教程

    ### ZEMAX光学设计教程知识点概述 #### 一、ZEMAX软件介绍 - **开发者与历史**: ZEMAX由ZEMAX公司...通过掌握序列描光和非序列描光两种不同的模拟模式,用户可以根据具体需求选择最合适的方法来进行光学设计工作。

    PHP实例开发源码—Compxler PHP版.zip

    1. **设计模式**:源码可能包含了常见的设计模式实现,如单例、工厂、观察者等,这些都是编写可维护和可扩展代码的关键。 2. **错误处理与调试**:查看源码可以了解如何有效地处理错误和异常,以及如何使用调试工具...

    打字排练程序,Vb写的

    在VB编程中,可以使用数组来存储字符序列,通过随机数生成器来选取字符。同时,利用条件语句判断用户的输入是否正确,并更新正确率和计时数据。最后,通过更新界面控件的文本属性来显示相关信息。 这个“打字排练...

    大厂真题及编程题目包含很多算法及真题

    8. **设计模式**:单例模式、工厂模式、装饰器模式等,考察你的面向对象编程思维。 9. **系统设计**:设计大规模系统架构,考察你的分布式系统知识和问题解决能力。 通过"python-algorithm-master",你不仅可以...

    源代码和数据库皆上传。此项目为SSH框架的服务器端与Android的客户端通过Json进行数据交互,适合新手,简单易学

    - **Struts2**:Struts2是MVC(模型-视图-控制器)设计模式的实现,负责处理HTTP请求,将数据传递给模型并渲染视图。它为Web应用提供了一种组织架构,便于开发和维护。 - **Hibernate**:Hibernate是一个ORM...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

    原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR ... 11.10.2 加强的生成器特性   11.11 练习   第12章 模块   12.1 什么是模块   12.2 模块和文件   12.2.1 模块名称...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

    原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR ... 11.10.2 加强的生成器特性   11.11 练习   第12章 模块   12.1 什么是模块   12.2 模块和文件   12.2.1 模块名称...

    dianziqin.rar_德飞莱_德飞莱单片机_电子琴_电子琴 51

    51单片机,作为微控制器领域的一款经典产品,因其易学易用、功能强大而被广泛应用于各种电子项目中。本篇文章将深入探讨一个基于51单片机的电子琴程序,该程序是针对德飞莱开发板设计的课程设计作业,旨在帮助读者...

    python3.43官方教程

    - **生成器表达式**:更简洁地创建生成器。 #### 十、标准库概览 - **操作系统接口**:与操作系统交互。 - **文件通配符**:处理文件名匹配。 - **命令行参数**:读取命令行输入。 - **错误输出重定向和程序终止**...

    基于-单片机的俄罗斯方块游戏设计.doc

    1. 方块生成:随机生成不同形状的方块序列。 2. 方块移动:控制方块在屏幕上的水平移动。 3. 方块旋转:实现方块90度的顺时针或逆时针旋转。 4. 方块下落:模拟重力效应,使方块自动下落。 5. 碰撞检测:判断方块与...

    简明Python教程(byte of python)

    5. **生成器**:通过yield关键字创建生成器,实现惰性计算和内存优化。 **Python3标准库** Python3的标准库非常庞大,其中一些重要的模块包括: - **os**:提供与操作系统交互的接口,如文件和目录操作。 - **sys...

    Python核心编程第二版

     11.10.2 加强的生成器特性   11.11 练习   第12章 模块   12.1 什么是模块   12.2 模块和文件   12.2.1 模块名称空间   12.2.2 搜索路径和路径搜索   12.3 名称空间   12.3.1 名称空间与...

    ob190_basic解释器_basic_源码.zip

    对于每一行代码,解释器都会生成相应的指令序列,并直接在内存中执行。 5. 错误处理:解释器需要有强大的错误处理机制,以便在源代码存在错误时能及时发现并给出友好的错误信息。 四、源码学习价值 通过研究OB190...

    基于PHP的SIYUCMS基于ThinkPHP5.1+BootStrap开发的CMS内容管理系统源码.zip

    至于【压缩包子文件的文件名称列表】中的"132675167875231308",这看起来像一个随机生成的数字序列,可能是为了保护源码的安全而命名的,通常在解压后会看到更详细的文件结构和名称,包括控制器、模型、视图、配置...

    基于51的8*8led灯的扫描显示程序

    在电子技术领域,51单片机是一种广泛应用的微控制器,尤其在教学和入门级项目中,它因为其简单易学、资源丰富而备受青睐。本项目“基于51的8*8LED灯的扫描显示程序”就是这样一个典型实例,旨在帮助初学者理解并实践...

    python3.4.3入门指南

    Python中的类支持继承,私有变量,以及迭代器和生成器的概念。异常本身也可以被看作是一种特殊的类。 Python的标准库为开发者提供了许多实用的功能,涵盖了操作系统接口、文件通配符、命令行参数处理、数学运算、...

Global site tag (gtag.js) - Google Analytics