JAVA版数据库主键ID生成器

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class sequence {
    private static final long ONE_STEP = 10;
    private static final Lock LOCK = new ReentrantLock();
    private static long lastTime = System.currentTimeMillis();
    private static short lastCount = 0;
    private static int count = 0;

    @SuppressWarnings("finally")
    public static String nextId()
    {
        LOCK.lock();
        try {
            if (lastCount == ONE_STEP) {
                boolean done = false;
                while (!done) {
                    long now = System.currentTimeMillis();
                    if (now == lastTime) {
                        try {
                            Thread.currentThread();
                            Thread.sleep(1);
                        } catch (java.lang.InterruptedException e) {
                        }
                        continue;
                    } else {
                        lastTime = now;
                        lastCount = 0;
                        done = true;
                    }
                }
            }
            count = lastCount++;
        }
        finally
        {
            LOCK.unlock();
            return lastTime+""+String.format("%03d",count);
        }
    }
    public static void main(String[] args)
    {
        //测试
        for(int i=0;i<1000;i++)
        {
            System.out.println(nextId());
        }
    }
}

据说如果是用在集群环境,需要在前面加上机器的编号,或者IP。

时间: 2024-10-27 09:49:38

JAVA版数据库主键ID生成器的相关文章

数据库主键ID生成策略

前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库分别的需求,会在自增的前提下,使用不同起点,但需要做数据库拓展时,极其麻烦. 比如刚开始时,我们设计某个系统的数据库时,这个数据库中会有10个表,那么我们对于每个表的内容都需要不同的ID我们就可以使用不同不长自增的形式,比如,第一张表的是1.11.21.31... 第二张表是2.12.22.32..

数据库主键

在我们的数据库设计中,不可逃避的就是数据库表的主键,可能有很多朋友没有深入思考过,主键的设计对整个数据库的设计影响很大,因此我们不得不要重视起来. 主键的必要性 : 在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键.它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除. 主键的无意义性 : 在开发过程中,读者可能会看到将一些表使用有意义的字段表示主键,例如"用户登录信息表"将&quo

数据库主键和外键

1 什么是主键 外键 学生表(学号,姓名,性别,班级)   学号是一个主键 课程表(课程号,课程名,学分) 课程号是一个主键 成绩表(学号,课程号,成绩) 学号和课程号的属性组构成一个主键 成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键 定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 以一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表 2 外键的作用 外键用于保持数据一致性,完整性 主要目的

数据库主键自增插入显示值

SQL Server 2008 数据库主键自增插入显示值 前几天在工作的时候遇到在删除数据库中表的数据的时候,删除之后,重新添加的数据没有得到原来的数据的id值(表中id为主键,且设置为自增) ,使用的是SQL Server 2008 ,现在已解决,和大家分享一下! 具体情况: 1.建立表t_test,设置主键自增,如下图 2.向表中插入数据 由于表中的主键字段id为自增在插入的时候不需要指定显示插入,所以Sql 语句为 <span style="font-size:24px;"

闲谈系列之一——数据库主键GUID

昨日一个行内兄弟由于工作调动要派到某二线城市工作,虽然有高额工资和补助的诱惑但也难以释怀离京蛋蛋的忧桑,约好晚上到老聚点道个别.主要是聊(chui)聊(chui)前(niu)程(bi),几瓶夺命大绿棒子下肚,这货问起我现在项目的情况(操蛋的技术控!),我简单的说了一下架子和数据库,果然在数据库主键上出现了分歧,在他心里主键就是应该是妥妥的自增整型,对于我的GUID无法容忍,并指出GUID不连续.效率低下.blablabla,最后我说了一下我的解决方案总算得到了一定程度的肯定吧... 对于程序猿来

数据库主键的设计和思考

转载至:http://blog.csdn.net/likika2012/article/details/9949949 1. 何谓数据库主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY约束确保唯一数据,所以经常用来定义标识

关系型数据库主键总结

在基于关系型数据库设计时候,通常要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行记录的属性或属性组,一个表只能有一个主键,但可以 有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除.修改时不出现错误.当然,其它字段可以辅助我们在执行这些操作时消除 共享冲突,不是本文讨论的重点,不再赘述.主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致.所以数据库在设计时,主键起到了很重 要的作用.常见的数据库主键选取方式有: 自动增长式.手动增长式 .U

数据库主键到底是用自增长(INT)好还是UUID好

其实针对使用自增长还是UUID,大家讨论最多的就是速度和存储空间,这里我加入了安全性和分布式,具体对比如下: 使用自增长做主键的优点:1.很小的数据存储空间2.性能最好3.容易记忆使用自增长做主键的缺点:1.如果存在大量的数据,可能会超出自增长的取值范围2.很难(并不是不能)处理分布式存储的数据表,尤其是需要合并表的情况下3.安全性低,因为是有规律的,容易被非法获取数据使用GUID做主键的优点:1.它是独一无二的,出现重复的机会少2.适合大量数据中的插入和更新操作,尤其是在高并发和分布式环境下3

Oracle数据库主键自增

Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面我就为大家介绍两种实现主键自增的方法. 两种方法的基础都有一个概念就是序列(sequence)的概念,一种是利用序列和显式调用的方式去实现主键自增,另一种是通过序列和触发器(trigger)来实现主键自增. /*1.利用序列主键自增*/ 第一步.创建表 --创建表,主键为ID CREATE TABL