我正在使用EclipseLink 2.4.2(与Spring结合使用,但我不认为它与我们的问题有任何关系)并且我们有几次以下异常:
org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常是javax.persistence.RollbackException:Exception [EclipseLink-4002](Eclipse Persistence Services - 2.4.2.v20130514-5956486):org.eclipse.persistence.exceptions.DatabaseException
内部异常:java.sql.SQLIntegrityConstraintViolationException:ORA-00001:违反了唯一约束(****。PK _ *****)
我们的主键由EclipseLink生成,它使用Oracle序列来分配它们。我仔细检查过,allocationSize
与序列中定义的increment by
完全匹配。
以下是我们的Java类中如何定义此序列的示例:
@Id
@SequenceGenerator(name = "SOME_GENERATOR", sequenceName = "SOME_SEQ", allocationSize = 10000, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOME_GENERATOR")
@Column(name = "ID")
private Long id;
这是序列创建SQL语句:
CREATE SEQUENCE SOME_SEQ INCREMENT BY 10000 START WITH 10000;
当然,问题难以复制,只能随机发生。当服务器负载很重时,似乎更经常发生。
我不知道这是否相关,但这里有一些额外的信息:
我的第一个想法是,这与并发有关,但对于这样一个成熟的框架来说,这似乎是一个相当严重的问题。我应该核实的任何其他事情,或者我可能忽略的事情?
我查看了相关帖子,例如:
但他们似乎对我的情况没有帮助。
答案 0 :(得分:1)
我们最终找到了对此问题的解释。
实际问题来自数据库被重置的事实(因此删除表和序列,然后重新初始化所有内容),但应用程序服务器不是。
由于ID由多个实体使用,因此行为相当随机,实际上不太可能发生冲突。
现在,开发人员和测试人员将在重置数据库后重新启动应用程序服务器。