开心一笑
提出问题
如何使用jAVA生成流水号,同时支持可配置和高并发???
解决问题
假设你们项目已经整合缓存技术
假如你有一定的Java基础
假如……
下面的代码实现的是一个支持高并发,可配置,效率高的流水号生成器,可同时为一个项目的多个模块使用,流水号支持缓存,即每次会预先生成一定数量的流水号存放在缓存中,需要的时候,优先到缓存中去,缓存中的序列号使用完之后,重新生成一定数量的流水号放到缓存中,如此循环,提高效率……
同时,该流水号生成器是线程安全的,使用线程锁进行保护,已经真正的投入到项目中使用……
数据库表设计
CREATE TABLE sys_serial_number2 (
"id" varchar(32) COLLATE "default" NOT NULL,
"module_name" varchar(50) COLLATE "default",
"module_code" varchar(50) COLLATE "default",
"config_templet" varchar(50) COLLATE "default",
"max_serial" varchar(32) COLLATE "default",
"pre_max_num" varchar(32) COLLATE "default",
"is_auto_increment" char(1) COLLATE "default"
)
说明:
module_name:模块名称
module_code:模块编码
config_templet:当前模块 使用的序列号模板
max_serial:存放当前序列号的值
pre_max_num:预生成序列号存放到缓存的个数
is_auto_increment:是否自动增长模式,0:否 1:是
注意:目前序列号模板只支持字母,动态数字(0000 代表1-9999),和日期用${DATE}的组合形式
is_auto_increment配置为1 ,这时配置模板为CX000000生成的序列号为:CX1 ,CX2,CX3…..
配置为0,这时配置模板为CX0000000生成的序列号为:CX00000001,CX00000002,CX00000003
数据库配置说明:如需要项目模块的项目编号,则需要在数据库表sys_serial_number中配置一条记录:
| id | module_name | module_code | config_templet | max_serial | pre_max_num | is_auto_increment
|-------|--------------|--------------|-----------------|-------------|-------------|--------------------/
| xxxx | 项目 | PJ |CX00000000${DATE}| 2650 | 100 | 1
CX00000000${DATE}生成的序列号类似于:CX0000000120160522 ,CX0000000220160522,CX0000000320160522 ……
序列号model实体设计:
package com.evada.de.serialnum.model;
import com.evada.de.common.model.BaseModel;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* 功能描述:序列号表模型
*
* @author :Ay 2015/11/23
*/
@Entity
@Table(name="sys_serial_number")
public class SystemSerialNumber extends BaseModel {
/**
* 模块名称
*/
@Column(name = "module_name", columnDefinition = "VARCHAR")
private String moduleName;
/**
* 模块编码
*/
@Column(name = "