我使用 Spring Web 和 Hibernate 开发了一个 REST-API。 我将它部署在两个服务器实例中,它运行了大约 5 个月没有任何问题。现在它大部分工作正常,但在某些时期会抛出“MySQLIntegrityConstraintViolationException”,并显示消息“键“PRIMARY”的重复条目“235648””(重复的 id 正在更改)异常(exception))。
引发异常的类如下所示:
@Entity
@Table(name = "Metadata", catalog = "data")
public class Metadata{
private Long id;
private String field1;
private String field2;
//...
@Id
@Column(unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.TABLE)
public Long getId() {
return id;
}
//More Getters and Setters...
}
Java 代码没有改变,MySql 数据库也没有改变。 您知道为什么它无法正常工作吗?
最佳答案
最有可能的是,最终创建使用该表生成 ID 的实体的请求数量有所增加。
补救措施之一是在父方法中捕获该异常并重试(这可能是某种 PessimisticLock
异常,因为 id 表在检索和更新其表时必须进行物理锁定)内容)。
另一种方法是增加 allocationSize
选项,如果未进行自定义设置,则默认值为 50。您需要重新输入 hibernate 默认表/列名称,因为这已经在数据库中创建了:
@Id
@Column(unique = true, nullable = false)
@TableGenerator(
name="tableGen",
table="hibernate_sequences",
pkColumnName="sequence_name",
valueColumnName="next_val",
pkColumnValue="default",
allocationSize=100
@GeneratedValue(strategy = GenerationType.TABLE, generator="tableGen")
public Long getId() {
return id;
}
这是一篇很好的文章,解释了表生成策略的可扩展性陷阱 -> link
关于java - Spring 与 hibernate : Duplicate entry for key 'PRIMARY' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48152646/