我们在2台负载均衡服务器上部署了Spring 3 + Hibernate应用程序。
在数据库中插入50次后,hibernate不会调用DB序列nextval,它会不断递增计数。由于这个原因,两个服务器的序列值都是重叠的,我得到了“唯一约束违规”异常。
E.g。比如说,第一次来自两台服务器的序列值分别为100和150。当第一个实例的序列达到149时,它应该调用seq.nextVal。但是因为它没有这样做并且不断地将seq值增加到150,而其他实例使用它并且它失败了。 default allocationSize: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;
}
提前致谢。
答案 0 :(得分:1)
如果您正在使用负载平衡器,但DB在实例之间共享,则无法缓存序列的值。
每次插入数据库时都需要输入下一个序列值。每个插入都必须在事务中。 Hibernate(默认情况下)的allocationSize = 50,因此要解决问题,必须将其明确设置为1。
@SequenceGenerator(allocationSize=1 ...)