0
我們使用hibernate,jpa和spring,我們的db是postgres 9.我們使用sequence來自動生成主鍵。但是我們注意到,當新記錄插入表中時,它會跳過20個數字,而在我們的序列中,我們的增量爲1,那麼爲什麼postgres會將下一個值遞增爲20.我們確實使用緩存值作爲「20」。postgres 9.0.4序列跳過號碼
我們使用hibernate,jpa和spring,我們的db是postgres 9.我們使用sequence來自動生成主鍵。但是我們注意到,當新記錄插入表中時,它會跳過20個數字,而在我們的序列中,我們的增量爲1,那麼爲什麼postgres會將下一個值遞增爲20.我們確實使用緩存值作爲「20」。postgres 9.0.4序列跳過號碼
這很正常。你可以告訴Hibernate不要緩存序列值 - 性能價格爲insert
s - 但這個仍然是並不意味着你不會有序列差距。
I wrote more about this on an older answer - here。
序列有差距。這是他們的本性。如果他們沒有差距,一次只能插入一個事務。
請參見:
瞭解詳情。
如果您期望無間斷序列,您需要了解您必須連續進行所有插入操作,只有一次事務能夠一次執行。要了解更多信息,請搜索「postgresql gaples序列」。依靠數據庫中的無縫序列通常是一個壞主意;相反,應用程序使用窗口函數或類似函數構造用戶可見值。
相關:
序列緩存爲每個連接。所以如果你打開和關閉每個事務的連接,這可以解釋它。 –
是的;我認爲馬是正確的。你正在增加1,但是緩存了20個。因此,它會緩存每個事務的20個數字,然後在連接關閉時丟棄它們。 –
那麼這意味着禁用順序緩存將解決此問題?影響是多大。 – user509755