Генератор идентификаторов DB2 BIGINT - PullRequest
2 голосов
/ 25 мая 2011

У меня есть следующий класс, загруженный в DB2 9.7.4 Express-C для генерации идентификаторов для строк

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;

Будет ли генерироваться идентификаторыиспользование этих функций уникально для сеансов db2 благодаря синхронизации, и является ли это лучшей альтернативой GENERATED ВСЕГДА КАК ИДЕНТИЧНОСТЬ, я знаю, что срок действия этих идентификаторов истекает в течение следующих 60 лет, но 60 лет - это длительный период

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Я использую GENERATE_UNIQUE с триггером ON INSERT для таблицы

IBM DB2 - GENERATE_UNIQUE

Вот статья на developerworks, которая называется Генерация универсально уникальных идентификаторов (UUID) что может помочь?

1 голос
/ 25 мая 2011

Эти идентификаторы, вероятно, не будут уникальными.Если у вас есть два сеанса в разных JVM, генерирующих идентификаторы одновременно, разрешение в миллисекундах недостаточно велико, чтобы гарантировать получение уникальных идентификаторов.

Рассмотрите возможность использования встроенного UUID.Тем не менее, это даст 128-битный UUID.Но это гарантирует уникальность даже между сессиями, даже в разных JVM.

Существует еще одно обсуждение переполнения стека, в котором рассматривается, как генерировать UUID типа long .

0 голосов
/ 25 мая 2011

Вы dx значение выглядит немного случайным. Он слишком большой, чтобы поместиться в int, и переполнит его, но он также не выглядит правильным. У вас есть 30 * (30 лет) * 386 (не уверен, должно ли это быть 356) * 12 (месяцев в году) * 30 (дней в типичном месяце)

...