我正在开发一个医疗通道中心的应用程序,多个用户通过JSF和JPA为医生预订。序列号对于Doctor,Date和Session是唯一的。我尝试从计算之前的预订中获取一个唯一的序列号并添加一个,但如果两个请求同时出现,则两个预订会获得相同的数字,从而导致功能上的麻烦。 在这种情况下如何获得唯一编号?我可以使用应用程序范围的bean来生成它吗? (我认为从数据库序列号中获取唯一编号并不实际,因为有几位医生,会议和每日他们必须有不同的预订编号。)
答案 0 :(得分:1)
这是我将如何做到的:
在数据库中有一个包含6列的表:
@Version
注释的字段,用于乐观锁定)确保在[doctorId,date,session]上添加一个独特的约束。
创建一个服务,在自己的事务中运行(REQUIRES_NEW传播),名为
getNextValue(doctorId, date, session)
此服务应该从数据库表中获取与其三个参数相对应的计数器,将其返回并递增。如果还没有行,它应该创建它。
还有可能让两个并发事务尝试同时创建或增加同一行。在创建的情况下,由于唯一约束,其中一个事务将回滚。在增量的情况下,由于JPA乐观锁定,其中一个事务将回滚。
如果服务回滚,则重试,直到不再有例外。
这可以避免将所有这些计数器存储在内存中,是无状态的,因此如果重新启动应用程序不会导致任何问题,即使您拥有服务器集群也能正常工作。
答案 1 :(得分:0)
这是在数据库中使用序列的完美案例。
您应该在数据库表中创建ID,并确保该字段是通过序列自动生成的,然后您不必担心两行使用相同的值。