JPA 并发问题 “在批处理发布时,它仍然包含 JDBC 语句”
我有一个并发问题,我试图用一个 while 循环来解决,该循环尝试多次保存实体,直到它达到某个最大重试计数。我想避免谈论是否有其他方法可以解决这个问题。我还有其他关于此的Stackoverflow帖子。:)长话短说:在派生的列上有一个唯一的约束,并且包括一个不断递增以避免冲突的数字部分。在循环中,我:
- 选择最大值(some_value)
- 递增结果
- 尝试使用此新结果保存新对象
- 显式刷新实体,如果由于唯一索引而失败,我将捕获 DataAccessException。
所有这些似乎都有效,除非循环返回到步骤1并尝试选择,否则我得到:
17:20:46,111 INFO [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements
17:20:46,111 INFO [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"
并捕获新的异常。这似乎是导致唯一约束冲突的第一次刷新,并引发不清除实体管理器的批处理。处理这个问题的适当方法是什么?我正在将Spring与JPA一起使用,并且无法直接访问实体管理器。我想如果我需要它,我可以注射它,但这是解决这个问题的痛苦。DataAccessException