读书人

基于单例模式的多键值序列号生成器兑现

发布时间: 2012-10-19 16:53:35 作者: rapoo

基于单例模式的多键值序列号生成器实现(带缓存)

基本思路:
?* 数据库表通过Hibernate映射为实体类,主键通过序列号生成器(KeyGenerator)生成;
?* 序列号生成器以Singleton方式工作,并维护所有需要维护的实体的序列号(KeyBean);
?* 列号生成器缓存一定的键值,避免每次取序列号都从数据库获取;
?* 数据库建立实体和当前键值对应表,每从列号生成器获取一个序列时,同步到该键值对应表,避免宕机后不一致

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->??1基于单例模式的多键值序列号生成器兑现(带缓存)package?com.pro.base.util;
??2基于单例模式的多键值序列号生成器兑现(带缓存)
??3基于单例模式的多键值序列号生成器兑现(带缓存)import?java.util.Map;
??4基于单例模式的多键值序列号生成器兑现(带缓存)import?java.util.concurrent.ConcurrentHashMap;
??5基于单例模式的多键值序列号生成器兑现(带缓存)import?org.springframework.beans.BeansException;
??6基于单例模式的多键值序列号生成器兑现(带缓存)import?org.springframework.context.ApplicationContext;
??7基于单例模式的多键值序列号生成器兑现(带缓存)import?org.springframework.context.ApplicationContextAware;
??8基于单例模式的多键值序列号生成器兑现(带缓存)
??9基于单例模式的多键值序列号生成器兑现(带缓存)import?com.pro.base.model.TableKey;
?10基于单例模式的多键值序列号生成器兑现(带缓存)import?com.pro.base.service.BasicService;
?11基于单例模式的多键值序列号生成器兑现(带缓存)
?12基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)/**?*//***
?13基于单例模式的多键值序列号生成器兑现(带缓存)?*?基于单例模式的多键值带缓存序列号生成器
?14基于单例模式的多键值序列号生成器兑现(带缓存)?*?
?15基于单例模式的多键值序列号生成器兑现(带缓存)?*?思路:
?16基于单例模式的多键值序列号生成器兑现(带缓存)?*?数据库表通过Hibernate映射为实体类,主键通过序列号生成器(KeyGenerator)生成;
?17基于单例模式的多键值序列号生成器兑现(带缓存)?*?序列号生成器以Singleton方式工作,并维护所有需要维护的实体的序列号(KeyBean);
?18基于单例模式的多键值序列号生成器兑现(带缓存)?*?列号生成器缓存一定的键值,避免每次取序列号都从数据库获取;
?19基于单例模式的多键值序列号生成器兑现(带缓存)?*?数据库建立实体和当前键值对应表,每从列号生成器获取一个序列时,同步到该键值对应表,避免宕机后不一致
?20基于单例模式的多键值序列号生成器兑现(带缓存)?*?
?21基于单例模式的多键值序列号生成器兑现(带缓存)?*?@author?o_oand0_0
?22基于单例模式的多键值序列号生成器兑现(带缓存)?*
?23基于单例模式的多键值序列号生成器兑现(带缓存)?*/
?24基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)public?class?KeyGenerator?implements?ApplicationContextAware?基于单例模式的多键值序列号生成器兑现(带缓存){
?25基于单例模式的多键值序列号生成器兑现(带缓存)????
?26基于单例模式的多键值序列号生成器兑现(带缓存)????//实现ApplicationContextAware,Spring对applicationContext自动装配;需要把KeyGenerator配置到Spring容器
?27基于单例模式的多键值序列号生成器兑现(带缓存)????private??ApplicationContext?applicationContext;
?28基于单例模式的多键值序列号生成器兑现(带缓存)
?29基于单例模式的多键值序列号生成器兑现(带缓存)????//键值实体类
?30基于单例模式的多键值序列号生成器兑现(带缓存)????private?Map<String,?KeyBean>?keyMap;
?31基于单例模式的多键值序列号生成器兑现(带缓存)????
?32基于单例模式的多键值序列号生成器兑现(带缓存)????//数据库服务
?33基于单例模式的多键值序列号生成器兑现(带缓存)????private?BasicService?basicService;
?34基于单例模式的多键值序列号生成器兑现(带缓存)????
?35基于单例模式的多键值序列号生成器兑现(带缓存)????//设置要缓存的键值的数量,建议在团队开发测试时设为1,省得总出现主键冲突,到上线后再调大
?36基于单例模式的多键值序列号生成器兑现(带缓存)????private?static?long?keyNum=20;
?37基于单例模式的多键值序列号生成器兑现(带缓存)????
?38基于单例模式的多键值序列号生成器兑现(带缓存)????private?static?final?KeyGenerator?instance=null;
?39基于单例模式的多键值序列号生成器兑现(带缓存)????
?40基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????private?KeyGenerator()?基于单例模式的多键值序列号生成器兑现(带缓存){
?41基于单例模式的多键值序列号生成器兑现(带缓存)????????basicService=(BasicService)applicationContext.getBean("basicService");
?42基于单例模式的多键值序列号生成器兑现(带缓存)????}
?43基于单例模式的多键值序列号生成器兑现(带缓存)????
?44基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public??ApplicationContext?getApplicationContext()?基于单例模式的多键值序列号生成器兑现(带缓存){
?45基于单例模式的多键值序列号生成器兑现(带缓存)????????return?applicationContext;
?46基于单例模式的多键值序列号生成器兑现(带缓存)????}
?47基于单例模式的多键值序列号生成器兑现(带缓存)
?48基于单例模式的多键值序列号生成器兑现(带缓存)????@Override
?49基于单例模式的多键值序列号生成器兑现(带缓存)????public?void?setApplicationContext(ApplicationContext?applicationContext)
?50基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????????throws?BeansException?基于单例模式的多键值序列号生成器兑现(带缓存){
?51基于单例模式的多键值序列号生成器兑现(带缓存)????????this.applicationContext=applicationContext;
?52基于单例模式的多键值序列号生成器兑现(带缓存)????}
?53基于单例模式的多键值序列号生成器兑现(带缓存)????
?54基于单例模式的多键值序列号生成器兑现(带缓存)????//以单例方式获取序列号生成器
?55基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public?static?synchronized??KeyGenerator?getInstance()基于单例模式的多键值序列号生成器兑现(带缓存){
?56基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????if(instance==null)基于单例模式的多键值序列号生成器兑现(带缓存){
?57基于单例模式的多键值序列号生成器兑现(带缓存)????????????return?new?KeyGenerator();
?58基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????}else基于单例模式的多键值序列号生成器兑现(带缓存){
?59基于单例模式的多键值序列号生成器兑现(带缓存)????????????return?instance;
?60基于单例模式的多键值序列号生成器兑现(带缓存)????????}
?61基于单例模式的多键值序列号生成器兑现(带缓存)????}
?62基于单例模式的多键值序列号生成器兑现(带缓存)????
?63基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????/**?*//**
?64基于单例模式的多键值序列号生成器兑现(带缓存)?????*?根据类名获取序列号
?65基于单例模式的多键值序列号生成器兑现(带缓存)?????*?@param?clazz
?66基于单例模式的多键值序列号生成器兑现(带缓存)?????*?@return
?67基于单例模式的多键值序列号生成器兑现(带缓存)?????*/
?68基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public??String?generatorKey(Class?clazz)基于单例模式的多键值序列号生成器兑现(带缓存){
?69基于单例模式的多键值序列号生成器兑现(带缓存)????????return?getKey(clazz);
?70基于单例模式的多键值序列号生成器兑现(带缓存)????}
?71基于单例模式的多键值序列号生成器兑现(带缓存)
?72基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????/**?*//**
?73基于单例模式的多键值序列号生成器兑现(带缓存)?????*?生成序列号,并同步至数据库
?74基于单例模式的多键值序列号生成器兑现(带缓存)?????*?此方法可以根据自己需要定义生成序列号的规则
?75基于单例模式的多键值序列号生成器兑现(带缓存)?????*?@param?clazz
?76基于单例模式的多键值序列号生成器兑现(带缓存)?????*?@return
?77基于单例模式的多键值序列号生成器兑现(带缓存)?????*/
?78基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public?String?getKey(Class?clazz)?基于单例模式的多键值序列号生成器兑现(带缓存){
?79基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????if?(keyMap?==?null)?基于单例模式的多键值序列号生成器兑现(带缓存){
?80基于单例模式的多键值序列号生成器兑现(带缓存)????????????keyMap?=?new?ConcurrentHashMap<String,?KeyBean>();
?81基于单例模式的多键值序列号生成器兑现(带缓存)????????}
?82基于单例模式的多键值序列号生成器兑现(带缓存)????????KeyBean?kb?=?keyMap.get(clazz.getName());
?83基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????if?(kb?==?null||kb.getMaxIndex()==kb.getNowIndex())?基于单例模式的多键值序列号生成器兑现(带缓存){
?84基于单例模式的多键值序列号生成器兑现(带缓存)????????????updateKeyBean(clazz.getName());
?85基于单例模式的多键值序列号生成器兑现(带缓存)????????}
?86基于单例模式的多键值序列号生成器兑现(带缓存)????????kb?=?keyMap.get(clazz.getName());
?87基于单例模式的多键值序列号生成器兑现(带缓存)????????long?now=kb.getNowIndex();
?88基于单例模式的多键值序列号生成器兑现(带缓存)????????kb.setNowIndex(now+1);
?89基于单例模式的多键值序列号生成器兑现(带缓存)????????return?now+"";
?90基于单例模式的多键值序列号生成器兑现(带缓存)????}
?91基于单例模式的多键值序列号生成器兑现(带缓存)
?92基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????/**?*//**
?93基于单例模式的多键值序列号生成器兑现(带缓存)?????*?同步序列值到数据库,并修改序列号生成器对应实体的下一键值
?94基于单例模式的多键值序列号生成器兑现(带缓存)?????*?@param?classPath
?95基于单例模式的多键值序列号生成器兑现(带缓存)?????*/
?96基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????private?void?updateKeyBean(String?classPath)?基于单例模式的多键值序列号生成器兑现(带缓存){
?97基于单例模式的多键值序列号生成器兑现(带缓存)????????TableKey?tk?=?(TableKey)?basicService.expandObjectByKey(TableKey.class.getName(),
?98基于单例模式的多键值序列号生成器兑现(带缓存)????????????????classPath);
?99基于单例模式的多键值序列号生成器兑现(带缓存)????????KeyBean?kb=new?KeyBean();
100基于单例模式的多键值序列号生成器兑现(带缓存)????????kb.setKeyName(classPath);
101基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????try?基于单例模式的多键值序列号生成器兑现(带缓存){
102基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????????if?(tk?==?null)?基于单例模式的多键值序列号生成器兑现(带缓存){
103基于单例模式的多键值序列号生成器兑现(带缓存)????????????????tk=new?TableKey();
104基于单例模式的多键值序列号生成器兑现(带缓存)????????????????kb.setMaxIndex(keyNum);
105基于单例模式的多键值序列号生成器兑现(带缓存)????????????????kb.setNowIndex(1);
106基于单例模式的多键值序列号生成器兑现(带缓存)????????????????tk.setTableName(classPath);
107基于单例模式的多键值序列号生成器兑现(带缓存)????????????????tk.setNowIndex(""+keyNum);
108基于单例模式的多键值序列号生成器兑现(带缓存)????????????????basicService.insert(tk);
109基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????????}?else?基于单例模式的多键值序列号生成器兑现(带缓存){
110基于单例模式的多键值序列号生成器兑现(带缓存)????????????????kb.setMaxIndex(keyNum+Long.valueOf(tk.getNowIndex()));
111基于单例模式的多键值序列号生成器兑现(带缓存)????????????????kb.setNowIndex(Long.valueOf(tk.getNowIndex()));
112基于单例模式的多键值序列号生成器兑现(带缓存)????????????????tk.setNowIndex(Long.valueOf(tk.getNowIndex())?+?keyNum?+?"");
113基于单例模式的多键值序列号生成器兑现(带缓存)????????????????basicService.update(tk);
114基于单例模式的多键值序列号生成器兑现(带缓存)????????????}
115基于单例模式的多键值序列号生成器兑现(带缓存)????????????keyMap.put(classPath,?kb);????????????
116基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????}?catch?(Exception?e)?基于单例模式的多键值序列号生成器兑现(带缓存){
117基于单例模式的多键值序列号生成器兑现(带缓存)????????????e.printStackTrace();
118基于单例模式的多键值序列号生成器兑现(带缓存)????????}
119基于单例模式的多键值序列号生成器兑现(带缓存)????}
120基于单例模式的多键值序列号生成器兑现(带缓存)
121基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public?Map<String,?KeyBean>?getKeyMap()?基于单例模式的多键值序列号生成器兑现(带缓存){
122基于单例模式的多键值序列号生成器兑现(带缓存)????????return?keyMap;
123基于单例模式的多键值序列号生成器兑现(带缓存)????}
124基于单例模式的多键值序列号生成器兑现(带缓存)
125基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public?void?setKeyMap(Map<String,?KeyBean>?keyMap)?基于单例模式的多键值序列号生成器兑现(带缓存){
126基于单例模式的多键值序列号生成器兑现(带缓存)????????this.keyMap?=?keyMap;
127基于单例模式的多键值序列号生成器兑现(带缓存)????}
128基于单例模式的多键值序列号生成器兑现(带缓存)
129基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public?BasicService?getBasicService()?基于单例模式的多键值序列号生成器兑现(带缓存){
130基于单例模式的多键值序列号生成器兑现(带缓存)????????return?basicService;
131基于单例模式的多键值序列号生成器兑现(带缓存)????}
132基于单例模式的多键值序列号生成器兑现(带缓存)
133基于单例模式的多键值序列号生成器兑现(带缓存)????
134基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????public?void?setBasicService(BasicService?basicService)?基于单例模式的多键值序列号生成器兑现(带缓存){
135基于单例模式的多键值序列号生成器兑现(带缓存)????????this.basicService?=?basicService;
136基于单例模式的多键值序列号生成器兑现(带缓存)????}
137基于单例模式的多键值序列号生成器兑现(带缓存)????
138基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????/**?*//***
139基于单例模式的多键值序列号生成器兑现(带缓存)?????*?键值实体类
140基于单例模式的多键值序列号生成器兑现(带缓存)?????*?@author?o_oand0_0
141基于单例模式的多键值序列号生成器兑现(带缓存)?????*
142基于单例模式的多键值序列号生成器兑现(带缓存)?????*/
143基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????protected?class?KeyBean?基于单例模式的多键值序列号生成器兑现(带缓存){
144基于单例模式的多键值序列号生成器兑现(带缓存)????????private?String?keyName;
145基于单例模式的多键值序列号生成器兑现(带缓存)????????private?long?nowIndex;
146基于单例模式的多键值序列号生成器兑现(带缓存)????????private?long?maxIndex;
147基于单例模式的多键值序列号生成器兑现(带缓存)
148基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????public?String?getKeyName()?基于单例模式的多键值序列号生成器兑现(带缓存){
149基于单例模式的多键值序列号生成器兑现(带缓存)????????????return?keyName;
150基于单例模式的多键值序列号生成器兑现(带缓存)????????}
151基于单例模式的多键值序列号生成器兑现(带缓存)
152基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????public?void?setKeyName(String?keyName)?基于单例模式的多键值序列号生成器兑现(带缓存){
153基于单例模式的多键值序列号生成器兑现(带缓存)????????????this.keyName?=?keyName;
154基于单例模式的多键值序列号生成器兑现(带缓存)????????}
155基于单例模式的多键值序列号生成器兑现(带缓存)
156基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????public?long?getNowIndex()?基于单例模式的多键值序列号生成器兑现(带缓存){
157基于单例模式的多键值序列号生成器兑现(带缓存)????????????return?nowIndex;
158基于单例模式的多键值序列号生成器兑现(带缓存)????????}
159基于单例模式的多键值序列号生成器兑现(带缓存)
160基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????public?void?setNowIndex(long?nowIndex)?基于单例模式的多键值序列号生成器兑现(带缓存){
161基于单例模式的多键值序列号生成器兑现(带缓存)????????????this.nowIndex?=?nowIndex;
162基于单例模式的多键值序列号生成器兑现(带缓存)????????}
163基于单例模式的多键值序列号生成器兑现(带缓存)
164基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????public?long?getMaxIndex()?基于单例模式的多键值序列号生成器兑现(带缓存){
165基于单例模式的多键值序列号生成器兑现(带缓存)????????????return?maxIndex;
166基于单例模式的多键值序列号生成器兑现(带缓存)????????}
167基于单例模式的多键值序列号生成器兑现(带缓存)
168基于单例模式的多键值序列号生成器兑现(带缓存)基于单例模式的多键值序列号生成器兑现(带缓存)????????public?void?setMaxIndex(long?maxIndex)?基于单例模式的多键值序列号生成器兑现(带缓存){
169基于单例模式的多键值序列号生成器兑现(带缓存)????????????this.maxIndex?=?maxIndex;
170基于单例模式的多键值序列号生成器兑现(带缓存)????????}
171基于单例模式的多键值序列号生成器兑现(带缓存)????}
172基于单例模式的多键值序列号生成器兑现(带缓存)????
173基于单例模式的多键值序列号生成器兑现(带缓存)}
1 楼 tan4836128 2011-10-25 有什么用?连实现场景都不能介绍,只能走马观花打打酱油,这样的文章也能上ITeye首页,不值一读! 2 楼 sssheep 2011-10-25 集群方式下能保证不产生重复的? 3 楼 o_oand0_0 2011-12-28 sssheep 写道集群方式下能保证不产生重复的?

我来替楼主回答:
集群方式下只要把取键的数量设为1就可以。相当于每次取键都和数据库同步。
另外,请楼主标明为转载。
地址:http://www.blogjava.net/o-oand0-0/archive/2011/10/21/361752.html
本人虽然写得不怎么的,但对于程序员来说,程序就像亲儿子。

读书人网 >编程

热点推荐