我为这个模糊的问题道歉,但我不知道怎么把它放在一个句子里。这就是为什么我甚至不能尝试谷歌这一点。
我有DropWizard资源,我使用Hibernate访问我的数据库。我有以下具有属性的实体。
Trip
====
id
from_place
to_place
time
user_who_booked_it
trip_group_ref
TripGroup
=========
id
from_place
to_place
time
TripGroup
基本上将所有来自地点和时间的行程分组。这对其他一些任务有帮助。
创建Trip
对象的资源首先需要检查匹配的TripGroup
是否存在,如果不存在则创建一个。{p}这带来了一个问题。如果存在并发请求,则可能会创建两个具有完全相同参数的TripGroup
个实例。
我该如何解决这个问题?
一种可能的解决方案是我将代码的一部分包装起来,在synchronized
块中检查并创建这些对象。但是,也许这不会起作用,因为在资源的方法完成之后,即在synchronized
块之外,将触发提交。
答案 0 :(得分:0)
实际上应该在数据库级别设置复制约束。即使您可以处理应用程序代码中的所有并发问题,也没有什么能阻止数据库客户端将重复的TripGroup行直接插入到表中。
在Dropwizard中,如果您使用Hibernate
,则可以使用以下内容注释TripGroup模型类:
@Entity
@Table(name = "trip_group", uniqueConstraints = @UniqueConstraint(columnNames = {"id", "fromPlace", "toPlace", "time"}))
public class TripGroup
这将在您的数据库中创建一个约束,并且在违反时会出现错误。如果您使用JDBI
,则需要手动创建表格或使用Liquibase
。