db4o 解決自動生成主鍵的問題 分享下初步想法

gltbeyond發表於2008-08-02
db4o 解決自動生成主鍵的問題 分享下初步想法
歡迎指點。
由於Db4o 資料庫沒有類似sequence的東西,而自帶的.ext().getUID()不是穩定的,在refragement資料庫後會發生變化,所以自己必須實現個,但考慮到這個系列必須持久化。

我使用的方法是 系統時間long + 一個小範圍的遞增數字
這裡的+ 不是加法,是追加位數,類似十進位制數字的左移。

因為如果單單使用系統時間,在併發度高的情況下,long是必定會重複的,就算synchorinzed, Thread.sleep(1)都沒有用處,何況在n核的伺服器上。

原始碼如下:


package com.glt.util;

import java.util.Date;

import org.apache.log4j.Logger;

/**
* 將此類作為系統的唯一系列號生產器
* 0. 生成規則 new Date().getTime()*10 + 1位遞增數(0-9)。 10為擴充套件基數
* 1. 即擴充套件位數! 這樣此類無需持久化!!
* 2. 存在的問題: 如果機器效能足夠地高,以至於EXTRA=10000時,仍然會出現重複的UUID,此方法無效了。
* @author Guolt_ecc
* */
public class SequenceGenerator {
//擴充套件基數
private static int EXTRA=10;

private long test= 1217603186953L; //預設的日期只有13w
private long test1=12176031876401L;
private long test2=121760318764011L;
private long test3=1217603187640110323L; //long 18位

private static final Logger log=Logger.getLogger("com.glt.util.SequenceGenerator");

//shortID 取值範圍[0,EXTRA)
private static int sID=0;


public static synchronized long getUID(){
long preID=new Date().getTime();
++sID;
if(sID==EXTRA){
sID=0;
}
return preID*EXTRA+sID;

}


}

相關文章