0

我们在 2 个负载平衡服务器上部署了 Spring 3 + Hibernate 应用程序。

在数据库中插入 50 次后,hibernate 不会调用数据库序列 nextval,它会不断增加计数。因此,来自两个服务器的序列值是重叠的,我得到“唯一约束违反”异常。

例如,第一次来自两个服务器的序列值分别为 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;
}

提前致谢。

4

1 回答 1

2

如果您使用负载均衡器,但数据库在实例之间共享,则无法缓存序列的值。

每次插入数据库时​​都必须询问下一个序列值。并且每个插入都必须在事务中。Hibernate(默认情况下)有 allocationSize = 50,所以要解决您的问题,您必须明确将其设置为 1。

 @SequenceGenerator(allocationSize=1 ...)
于 2013-05-29T14:31:37.980 回答