2013-05-29 19 views
0

我們在2個負載平衡服務器上部署了Spring 3 + Hibernate應用程序。Spring 3應用程序中的Hibernate @SequenceGenerator問題

50個插入數據庫之後,hibernate不會調用數據庫序列nextval,它會連續遞增計數。由於這一點,來自兩個服務器的序列值都是重疊的,我得到了「唯一約束違例」異常。

E.g.假設第一次來自兩臺服務器的序列值分別是100和150。當第一個實例的序列達到149時,它應該調用seq.nextVal。但是,由於它不這樣做,並不斷增加seq值到其他實例使用的150,並且它失敗。 默認分配大小:50

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CUSTOMER_ID_SEQ") 
@SequenceGenerator(name = "CUSTOMER_ID_SEQ", sequenceName = "CUSTOMER_SEQ") 
@Column(name = "CUST_ID", unique = true, nullable = false) 
public long getCustId() { 
return custId; 
} 

在此先感謝。

回答

1

如果您使用的是負載均衡器,但實例之間共享數據庫,則無法緩存序列的值。

每次插入數據庫時​​都必須要求輸入下一個序列值。並且每個插入必須位於一個事務中。 休眠(默認情況下)的allocationSize = 50,因此要解決您的問題,您必須明確將其設置爲1.

@SequenceGenerator(allocationSize=1 ...) 
相關問題