如何快速连续防止在数据库中创建重复条目? (JPA)

时间:2014-02-19 14:35:54

标签: java java-ee jpa transactions

我有一个项目,用户将JSON发布到我的API,然后将其反序列化为实体并持久保存到数据库。 由于运行负载测试工具会快速连续发布许多请求(使用相同的API密钥,但作为不同的'用户'),我发现我的一些实体在数据库中重复。

虽然我的代码检查对象是否已存在于数据库中,但某些请求同时触发的速度太快而且它们绕过了检查。

使用实体管理器,我认为每个请求都在自己的事务中,但我不确定如何“锁定”这些事务。除了将创建代码放在一般的java同步块中之外,有没有办法防止这种重复?

感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用的是关系数据库(I.E. SQL),那么最简单的方法就是让数据库为您完成。您和数据库表的唯一约束:

CREATE UNIQUE INDEX unique_author_name ON authors (first_name, last_name);

上面的示例包含名为“authors”的数据库表。每个作者都有名字和姓氏。约束阻止数据库存储2“马克吐温”。

当遇到尝试添加重复项时,JPA将抛出PersistenceException和ConstraintViolationException。

希望有所帮助:)

答案 1 :(得分:0)

首先,您可以在表上创建唯一约束,如果尝试插入重复,则会抛出异常。

另一件事是将transaction isolation level更改为更严格的(可序列化?)。但是需要权衡,因为它会减慢您对数据库的访问速度。

我建议使用第一种方法,特别是因为除了负载测试之外,这些冲突不会经常发生。