十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
java项目实现流水号自动增长
成都创新互联主营天全网站建设的网络公司,主营网站建设方案,重庆APP软件开发,天全h5微信平台小程序开发搭建,天全网站营销推广欢迎天全等地区企业咨询
项目中有一个规则编号字段,从1开始,编号长度为5位,那么第一条数据编号就是00001。
实现的基本思路就是项目启动时,从数据库获取当前最大值,作为静态变量存储;
业务获取新的编码,考虑并发问题,获取编码方法(编码自增部分)为synchronized同步方法,如果自增为原子操作,则无需同步;
编码前置0,使用String.format("%05d", newNum);格式化获取。
实现代码如下:
private final static AtomicInteger atomic = new AtomicInteger(0);
public static String startFormat(String format) {
return String.format(format, atomic.incrementAndGet());
}
在oracle中主键是不能自增的,不过可以创建一个序列
-- Create sequence
create sequence SEQ_TEXT
minvalue 1
maxvalue 9999
start with 60
increment by 1
cache 20;
在插入数据的时候
INSERT INTO STUDENT(ID,NAME) VALUES(SEQ_TEXT.NEXTVAL,'张三');
这样就可以了
首先,你如果想把id列设置为自增列,直接在数据库中将其设置为自增列就可以了。
然后,等你添加数据的时候使用如下的语句:
INSERT INTO dingdan(sname,snumber,rname,rnumber,address,beizhu,cdate) VALUES (?,?,?,?,?,?,?)
数据库会自动帮你添加id列的值。 所以,你的这个代码可以改为:
String insertCondition="INSERT INTO dingdan(sname,snumber,rname,rnumber,address,beizhu,cdate) VALUES (?,?,?,?,?,?,?)";
sql=con.prepareStatement(insertCondition);
sql.setString(1,handleString(sname));
sql.setString(2,handleString(snumber));
sql.setString(3,handleString(rname));
sql.setString(4,handleString(rnumber));
sql.setString(5,handleString(address));
sql.setString(6,handleString(beizhu));
sql.setTimestamp(7,new Timestamp(System.currentTimeMillis())); //获取系统当前时间
int m=sql.executeUpdate();
一、常见场景 多个线程针对一个i进行主键自增。多线程下如果不做安全策略,将会导致各个现成获取的i值重复,导致脏数据常见策略1、增加syschroize进行线程同步 2、使用lock、unlock处理 3、使用reetrantent 锁进行锁定 缺点:容易造成性能低下,或者编写代码容易造成死锁二、新方案jdk新提供的功能,atomicInteger(还有其他一atomic开头的原子性操作类) AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。 原理:通过java的CAS compare and swap,简称cas原语进行操作提升性能,这个也号称乐观锁,不阻塞 观锁实际上并不加锁,当计算遇到冲突或者说前后不一致时会重试 直到成功 CAS有3个操作数 内存值V 要跟内存值做比较的值A 和 新值 B while(true){ if(V == A){V = B;return ;}else{A = V;}}CAS的操作对象为volatile类型 volatile类型变量是:CPU直接读写变量所在的内存 而不是把变量copy到寄存器操作 这样对变量的操作所有线程都是可见的这样做的结果是减少了并发时冲突的概率 但不能完全避免