溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Jspxcms主鍵生成機(jī)制是什么

發(fā)布時(shí)間:2022-01-19 16:31:51 來源:億速云 閱讀:103 作者:iii 欄目:開發(fā)技術(shù)

這篇“Jspxcms主鍵生成機(jī)制是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Jspxcms主鍵生成機(jī)制是什么”文章吧。

數(shù)據(jù)庫(kù)主鍵生成策略通常有

  • 自增主鍵。依賴數(shù)據(jù)庫(kù)的功能,mysql、sqlserver有主鍵自增功能,oracle、db2則沒有。

  • 數(shù)據(jù)庫(kù)序列。依賴數(shù)據(jù)庫(kù)的功能,mysql沒有序列。

  • UUID。不依賴數(shù)據(jù)庫(kù)。通過程序產(chǎn)生一個(gè)32位的不重復(fù)的字符串。由于字符串過于長(zhǎng),作為主鍵容易影響數(shù)據(jù)庫(kù)性能。

  • Table策略。使用一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)表來記錄其他其他表的主鍵值,模仿數(shù)據(jù)庫(kù)序列的功能。

其中Table策略通用性好,在任何數(shù)據(jù)庫(kù)下都可以通用。在Jspxcms中,這張表的名稱:hibernate_sequences(7.0及之前版本為t_id_table)。里面分別記錄了表名及其相應(yīng)的ID值。

代碼中的domain實(shí)體類中有ID生成方式的注解。以com.jspxcms.core.domain.Info為例:

    @Id
    @Column(name = "f_info_id", unique = true, nullable = false)
    @TableGenerator(name = "tg_cms_info", pkColumnValue = "cms_info", initialValue = 1, allocationSize = 10)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "tg_cms_info")
    public Integer getId() {
        return this.id;
    }

其中initialValue是主鍵的起始值,allocationSize是JPA一次獲取ID的數(shù)量。由于獲取ID需要消耗性能,所以不會(huì)插入一條數(shù)據(jù)就獲取一個(gè)ID,而是一次性獲取10個(gè)、50個(gè)、100個(gè),甚至更多。這會(huì)導(dǎo)致ID不連續(xù),比如一次獲取10個(gè)ID后,只用了一兩個(gè),程序就重啟了,那剩下的八九個(gè)ID就作廢了。

如果第三方程序要插入數(shù)據(jù)到這些表中,就要非常注意ID的問題。需要自行修改hibernate_sequences表中的ID值,否則會(huì)導(dǎo)致主鍵沖突的異常。

需要特別注意的是,hibernate_sequences中的next_val(ID值)是實(shí)際使用ID+2*allocationSize,比如當(dāng)前使用的ID值是100,allocationSize是10,那么ID表中的next_val好像應(yīng)該110,但實(shí)際上是120。

自己修改hibernate_sequences的next_val時(shí)需要特別小心,看到next_val為100時(shí),可以使用101作為自己的ID,但應(yīng)該把next_val改到一個(gè)更大值,不是改成102,也不是110,而是要改成120(allocationSize為10的情況下)。而allocationSize默認(rèn)的值是50,在需要大量插入數(shù)據(jù)的情況下,程序還會(huì)把這個(gè)值設(shè)置的更大。所以不要怕浪費(fèi)ID值,把next_val改大一點(diǎn)總是安全的。

以上就是關(guān)于“Jspxcms主鍵生成機(jī)制是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI