DB2 BIGINT id生成器

时间:2011-05-25 07:01:31

标签: java db2 uuid

我将以下类加载到DB2 9.7.4 Express-C中以生成行的ID

public class Int64UUID {

    public static final long dx =  30*386*12*30*24*3600*1000; // starting at 2000 year
    public static long lastUUID = System.currentTimeMillis() - dx;

    public static synchronized long random(){
        long uuid = System.currentTimeMillis() - dx;
        while(uuid == lastUUID)
            uuid = System.currentTimeMillis() - dx;
        lastUUID = uuid;
        return uuid;
    }

    public static void main(String[] args) {
        System.out.println(Int64UUID.random());
    }

}

以及使用它的以下功能

CREATE FUNCTION "MYSCHEMA"."INT64_GUID" ( )
  RETURNS BIGINT
  SPECIFIC "SQL110520165927000"
  LANGUAGE JAVA
  PARAMETER STYLE JAVA
  EXTERNAL NAME 'Int64UUID.random'
  NOT DETERMINISTIC
  NO EXTERNAL ACTION
  NO SQL
  CALLED ON NULL INPUT
  DISALLOW PARALLEL;

使用这些函数生成的ID由于同步而在db2会话中是唯一的,并且这些是对GENERATED ALWAYS AS IDENTITY的更好的替代方法,我知道这些id将在未来60年到期,但60年是长期

3 个答案:

答案 0 :(得分:1)

这些ID可能不是唯一的。如果在不同的JVM中有两个会话同时生成ID,则毫秒级的分辨率不足以确保您获得唯一ID。

考虑使用内置的UUID。但是,这将产生128位UUID。但即使在不同的JVM中,它也确保了甚至跨会话的唯一性。

还有另一个堆栈溢出讨论,讨论如何 generate UUID of long type

答案 1 :(得分:1)

我使用GENERATE_UNIQUE和表的触发器ON INSERT

IBM DB2 - GENERATE_UNIQUE

以下是一篇名为Generating universally unique identifiers (UUID)的developerworks文章 这可能会有所帮助吗?

答案 2 :(得分:0)

dx值看起来有点随机。它太大而不适合int并且会过流,但它看起来也不正确。你有30 *(30年)* 386(不确定这应该是356)* 12(每年月份)* 30(典型月份的天数)