我有一个样例Spring Rest应用程序。我有几个客户端在访问Spring Rest应用程序中的API。API根据我们使用的MSSQL DB检查作业是否已启动。如果数据库中的作业状态为已启动状态,它将挑选记录并将其状态更新为正在进行中,并将作业的详细信息作为对API的响应返回给API,客户端将基于此进行一些处理。
我们观察到,多个客户端正在选择处于已启动状态的同一个Job,并将其更新为正在进行中,并将响应传递给客户端。因此,最终结果就像多个客户端正在处理相同的作业。
为了解决这个问题,我们添加了一个synchronized块,并封装了DB调用,该调用挑选处于已启动状态的记录,并将其更新为正在进行中。DB调用驻留在服务层。但重复的问题仍然存在。
如果控制器和后续层(如服务层和DAO层)是单例的,那么当多个API调用命中web应用程序时,同步的代码块应该一次由一个请求执行。但这并不是我们实际看到的。
有没有人能帮我解决这个问题?
发布于 2020-10-15 05:16:08
实际上,Rest控制器是线程安全的,这意味着它能够唯一地处理每个HTTP请求。此外,当您尝试访问Rest控制器时,它会在浏览器中创建一个单独的会话id,您也可以使用开发人员控制台进行检查。在这里,您正在尝试访问相同的数据库并将状态更改为正在进行中,因此下一个api有机会获取前一个会话的详细信息。因此,尝试修改Rest API,而不是每次都修改数据库中的状态,或者您可以这样做:如果一个API访问数据库,则另一个API应该在第一个连接关闭之前不能访问数据库。希望这能为你工作。
https://stackoverflow.com/questions/64364485
复制相似问题