db4o 解決自動生成主鍵的問題 分享下初步想法
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;
}
}
歡迎指點。
由於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;
}
}
相關文章
- db4o適合負載均衡應用下的問題解決嗎負載
- 小議SQL Server主鍵和自動編號問題SQLServer
- MySQL自增主鍵跳號問題MySql
- 【mybatis-plus】主鍵id生成、欄位自動填充MyBatis
- cqrs架構下的主鍵如何生成架構
- 關於資料庫表記錄主鍵生成的問題?資料庫
- MyBatis在Oracle中插入資料並返回主鍵的問題解決MyBatisOracle
- 資料庫自增主鍵可能產生的問題資料庫
- react解決ios微信分享的問題ReactiOS
- Laravel 中使用 Redis 生成自增主鍵LaravelRedis
- AWR不能自動生成快照解決方法?
- Mybatis-Plus3.0預設主鍵策略導致自動生成19位長度主鍵id的坑MyBatisS3
- 一鍵解決App應用分發下載問題APP
- [求助]Hibernate自增長主鍵的設定問題和事務問題
- 解決windows10下總是很快自動黑屏進入睡眠問題Windows
- 問題解決:下載的網頁開啟後自動跳轉到首頁網頁
- AliAGC 自動增益控制演算法:解決複雜場景下的音量問題GC演算法
- Oracle EXPDP自動備份緩慢問題解決Oracle
- 解決無法自動掛載U盤問題
- 奇聲音響自動關閉的問題解決了
- 動態生成html元素繫結事件iphone失效問題解決HTML事件iPhone
- java主鍵生成Java
- SaaS無法解決“關鍵”問題
- 解決VNC有些鍵不能輸入的問題VNC
- rlwrap包解決Linux下sqlplus中上下鍵,退格鍵不能用的問題LinuxSQL
- YII2自動登入Cookie失效問題解決Cookie
- MySQL 資料庫自增主鍵生成的優缺點MySql資料庫
- 怎樣成為解決問題的高手?——關於問題解決的關鍵4步驟
- 操作hibernate多主鍵的問題?
- 解決在Windows 11下Visual Studio部分快捷鍵失效的問題Windows
- 解決Linux下Vim編輯複製貼上會自動縮印問題Linux
- Trace檔案過量生成問題解決
- pyinstaller 生成 exe 的閃退問題解決方案
- linux建立賬戶並自動生成主目錄和主目錄下的檔案Linux
- 深入瞭解MySQL中的自增主鍵MySql
- mysql主從不同步問題解決MySql
- windows 安裝 MongoDB 卡主問題解決WindowsMongoDB
- Hibernate 主鍵的生成策略