我将以下类加载到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年是长期
答案 0 :(得分:1)
这些ID可能不是唯一的。如果在不同的JVM中有两个会话同时生成ID,则毫秒级的分辨率不足以确保您获得唯一ID。
考虑使用内置的UUID
。但是,这将产生128位UUID。但即使在不同的JVM中,它也确保了甚至跨会话的唯一性。
还有另一个堆栈溢出讨论,讨论如何 generate UUID of long type。
答案 1 :(得分:1)
我使用GENERATE_UNIQUE和表的触发器ON INSERT
以下是一篇名为Generating universally unique identifiers (UUID)的developerworks文章 这可能会有所帮助吗?
答案 2 :(得分:0)
您dx
值看起来有点随机。它太大而不适合int
并且会过流,但它看起来也不正确。你有30 *(30年)* 386(不确定这应该是356)* 12(每年月份)* 30(典型月份的天数)