hibernate實(shí)體在sybase數(shù)據(jù)庫(kù)下使用native或identity主鍵生成策略會(huì)出現(xiàn)主鍵跳躍的現(xiàn)象。
現(xiàn)象如下:
Sql代碼
select * from tablename;
1
2
3
5000000000001
出現(xiàn)此種問(wèn)題一般由于sybase數(shù)據(jù)庫(kù)不正常關(guān)閉導(dǎo)致的。
深層原因:
由于sybase數(shù)據(jù)庫(kù)每次啟動(dòng)后都會(huì)緩存一定跨度的主鍵到內(nèi)存中,默認(rèn)是主鍵字段長(zhǎng)度的0.5%的跨度;如果sybase數(shù)據(jù)庫(kù)不正常關(guān)閉,導(dǎo)致sybase無(wú)法把當(dāng)前正在使用的主鍵id的序號(hào)寫(xiě)入磁盤(pán);當(dāng)數(shù)據(jù)庫(kù)再次啟動(dòng)后,無(wú)法讀取上次正在使用的主鍵id,sybase會(huì)重新取下一個(gè)跨度的主鍵序號(hào)進(jìn)內(nèi)存。導(dǎo)致表主鍵的數(shù)值跨度非常大
譬如說(shuō): 主鍵 id_ numeric(6,0),首次緩存到內(nèi)存中的主鍵跨度從1到 1000000*0.5%,如果不正常關(guān)閉后,下次啟動(dòng)數(shù)據(jù)庫(kù)加載到內(nèi)存的主鍵跨度從 1000000*0.5%到 1000000*1%。
解決方法:
設(shè)定sybase數(shù)據(jù)庫(kù)每次加載到內(nèi)存的主鍵序號(hào)的跨度,命令是:
Sql代碼
sp_chgattribute tablename ,'identity_gap', 1000;
注意語(yǔ)句中的引號(hào)和逗號(hào)。
作者“loginin”