【发布时间】:2011-12-29 07:37:18
【问题描述】:
我有以下问题:
我有一个多线程服务器端应用程序,其中每个请求都执行一个新线程(标准情况)。基于此请求,应用程序检查所需的数据是否已缓存在数据库中。如果是,它将获取它并将其发送回客户端。如果没有,则调用远程服务,将响应存储在数据库中,然后将其提取并返回给客户端。
该服务需要一段时间来计算数据,并且由于对我的应用程序的请求是异步执行的,因此我陷入了一个请求检查数据库的陷阱,发现那里没有任何内容,然后调用该服务。然而,与此同时,具有相同输入的另一个请求将检查数据库,并且由于服务需要一段时间,因此那里仍然没有任何内容......因此它将启动对服务的另一个调用。结果,数据被写入数据库两次,这会破坏任何成功的操作,依赖于它的唯一性(不能有两条具有相同数据的记录)
我应该选择什么解决方案? 一种想法是将特定的 UNIQUE 字段约束放在数据库中。这样,即使应用程序尝试写入两次,数据库也会简单地拒绝它,并且应用程序会抛出异常。但是,该服务仍会执行多次。
我想到的另一个解决方案是同步调用 Web 服务的方法。这样,对我的应用程序的每个连续请求都将在前一个操作完成之前放入等待堆栈。这样,如果另一个具有相同输入数据的请求进来,而第一个请求仍在等待远程服务的结果,它将坐下来等待操作完成。然后,当第二个请求检查数据库时,数据已经存在,无需再次调用服务。这也将防止在数据库中有多个相同的记录。这样做的问题是我的服务器应用程序的速度将不可避免地降低,因为每个请求都必须等待,即使是那些通常不应该等待的请求(那些,据说我们已经在数据库中有数据)
还有其他建议吗?我被困住了。如何实现某种条件同步?
【问题讨论】:
标签: java database web-services hibernate spring