java id 生成器_JAVA ID生成器生成逻辑主键_java

news/2024/7/8 15:34:56

在一个数据库设计里,假如使用了逻辑主键,那么你一般都需要一个ID生成器去生成逻辑主键。

在许多数据库里面,都提供了ID生成的机制,如oracle中的sequence,MSSQL中的identity,可惜这些方法各种数据库都不同的,所以很多人愿意找寻一种通用的方式。

编写代码,1、2、3……这样一直累加是最直接的想法,java用以下方式去实现

private static AtomicInteger uniqueId = new AtomicInteger(0);

public static String nextId() {

http://www.gaodaima.com/64997.htmlJAVA ID生成器生成逻辑主键_java

return Integer.toString(uniqueId.incrementAndGet());

}

当然,这样太简单了,并且一重新启动,计数器就归 0 了,一般的做法可以用 时间 + 计数器 的方式,

private static final long ONE_STEP = 10;

private static final long BASE = 1129703383453l;

private static final Lock LOCK = new ReentrantLock();

private static long lastTime = System.currentTimeMillis();

private static short lastCount = 0;

/**

* a time (as returned by {@link System#currentTimeMillis()}) at which

* the VM that this UID was generated in was alive

* @serial

*/

private final long time;

/**

* 16-bit number to distinguish UID instances created

* in the same VM with the same time value

* @serial

*/

private final short count;

/**

* Generates a UID that is unique over time with

* respect to the host that it was generated on.

*/

public UID() {

LOCK.lock();

try {

if (lastCount == ONE_STEP) {

boolean done = false;

while (!done) {

long now = System.currentTimeMillis();

if (now == lastTime) {

// pause for a second to wait for time to change

try {

Thread.currentThread().sleep(1);

}

catch (java.lang.InterruptedException e) {

} // ignore exception

continue;

}

else {

lastTime = now;

lastCount = 0;

done = true;

}

}

}

time = lastTime;

count = lastCount++;

}

finally {

LOCK.unlock();

}

}

在一个群集的环境里面,通常还需要加上IP的前缀,即 IP + 时间 + 计数器,这个就是JAVA原版本的实现了。

欢迎大家阅读《JAVA ID生成器生成逻辑主键_java》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码

e7ce419cf2d6ad34d01da2ceb8829eed.png

微信 赏一包辣条吧~

023a57327877fb4402bcc76911ec18ea.png

支付宝 赏一听可乐吧~


http://www.niftyadmin.cn/n/673659.html

相关文章

方圆支承、荣盛发展2家公司8月8日挂牌中小板

今日,深交所披露,方圆支承将于8月8日挂牌中小板,其证券简称为“方圆支承”,证券代码为“002147”,该公司人民币普通股股份总数为9400万股,其中首次上网定价公开发行的1920万股股票自上市之日起开始上市交易…

java frame 显示图片_java Frame中显示不出图片来啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package com.hb.study;import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;import java.awt.event.Win…

新股发行一览

股票代码股票简称申购代码发行股数(万)发行价格认购日期中签号公布日上市日期发行市盈率相关链接 002163 三鑫股份 002163 3,400 07-8-9 (周四) 8-15 详细 行情 资讯 评论 002164 东力传动 002164 3,000 8.20 07-8-8 (周三&am…

java在文件中查找指定单词后面_Java开发网 - 如何从一个文件中找到指定的单词?...

{请您活用编辑功能修饰您的代码,别忘了禁止笑脸标记,谢谢}import java.io.*;import java.nio.*;import java.nio.channels.*;import java.nio.charset.*;public class Search {public static void main(String[] args) throws IOException {if(args.leng…

强者恒强,重心上移,关注高价股全面爆发机会!

历经6、7两月的大幅震荡之后,股指重归强势并创出新高。两个月的调整中,高价股的数量持续增加,其整体市场表现也大幅领先于中、低价股,可谓强者恒强。 以7月31日收盘数据计算,加权市场平均股价为13.48元,而以…

java中调用oracle存储过程_java中调用oracle存储过程

1. 由于每个存储过程的参数不同,可以编写以一个类提出所有操作。package com.lvhe.core.db;import java.sql.CallableStatement;import java.sql.Date;import java.sql.SQLException;import java.sql.Time;import java.sql.Timestamp;import java.util.ArrayList;…

近期总结_xdu 10月赛

XDU_OJ 10月赛 purple place 思路比较简单,从0~99999枚举就可以,但是要注意到每一位的数字表示的是状态,是可以出现前导0的。 所以输入时要用%s读取数据,枚举的数字转成string时注意些细节...... 魔法喵点喵 题目比较啰嗦&#xf…

java lazy 变量_java三个环境变量配置简单教程

在java 中需要设置三个环境变量(1.5之后不用再设置classpath了,但个人强烈建议继续设置以保证向下兼用问题)JDK安装完成之后我们来设置环境变量:右击“我的电脑”,选择“属性”,选择“高级”标签,进入环境变量设置&…