![](/img/trans.png)
[英]javax.persistence.EntityExistsException with SequenceGenerator
[英]Should javax.persistence.SequenceGenerator.allocationSize() be consistent with INCREMENT BY?
我有一個使用Hibernate javax.persistence.SequenceGenerator.allocationSize()屬性的問題。 當它設置為1時,我在向數據庫插入大量記錄時遇到性能問題。 否則,當我將其設置為默認值(50)或更高值時,我會收到異常,即具有指定標識符的實體已存在!
最大的問題是很多開發人員使用共享數據庫,因此生成的標識符實際上可能無法同步。
另一方面,我注意到使用“INCREMENT BY 1”創建的Oracle序列。 可以相應地設置這個,allocateSize可以解決問題嗎?
我使用的是WildFly 10.1(所以Hibernate版本是5.0.10)和Oracle 12c(12.2.0.1)。
提前感謝您的建議!
是的, SequenceGenerator
的allocationSize
的值以及數據庫遞增序列的步驟必須相同。
如果將allocationSize
屬性設置為50,則告訴Hibernate序列增加50並且在從序列中選擇下一個值之前它將在內部生成49個值。
如果保持allocationSize
和序列的增量同步,則無需擔心重復的ID。
我們說吧; 你有2台服務器連接到同一個數據庫。 兩個服務器都使用50的allocationSize
,並且您將數據庫序列配置為增加50。
Server1從序列中請求一個新值並獲得1000.它將在內部存儲該值並將其遞增直到達到1049。
在此期間,Server2從序列中請求一個新值並獲得1050.它將該值遞增到1099。
數據庫序列返回的下一個值將是1100.如您所見,將沒有重復的ID。 但主鍵值之間可能存在間隙,您無法使用它們按時間順序排序數據庫記錄。 但你不應該使用主鍵...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.