我使用Spring Web和Hibernate开发了一个REST-API。 我将它部署在两个服务器实例中,它运行大约5个月没有任何问题。现在它主要是工作但在某些时期" MySQLIntegrityConstraintViolationException "有消息" 重复条目' 235648'关键' PRIMARY' "被抛出(例如,重复的id正在改变)。
抛出异常的类看起来像这样:
@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数据库进行更改。 你知道为什么它不能正常工作吗?
答案 0 :(得分:2)
最有可能的是,最终创建使用该表生成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;
}
这是一篇很好的文章,解释了TABLE生成策略的可伸缩性缺陷 - > link
答案 1 :(得分:0)
@GeneratedValue(strategy = GenerationType.IDENTITY)
为我工作。