我正在运行的Web服务存在棘手的问题。我已经以一种不错的方式解决了它,但是我想知道我是否可以做得更好。
基本上,我正在运行Java Web服务(在AWS Elastic Beanstalk中,因此跨多个服务器)。该服务从其缓存中返回结果,但是如果缓存中不存在请求的输入(SQL Server DB),则该服务必须调用外部供应商。这要花钱,所以我想确保如果多台机器恰巧在同一时间(即第一台机器收到供应商响应并将其写入数据库之前)接收到请求,那么该调用不会在多台机器之间重复。
当前,我正在通过以下方式处理此问题:在进行外部调用之前将“ IsPending = 1”行写入数据库,然后将该行更新为“ IsPending = 0”,并在调用返回后填充接收到的数据。在任何计算机发出外部调用之前,它会检查数据库中是否有未决的行。如果找到一个,它将在活动线程上重复调用.sleep(),并在每次等待后(当前30毫秒)再次检查DB。如果等待时间过多,它只会自行发出呼叫(但是到目前为止,还没有真正发生)。
因此,尽管此解决方案大多数都可以使用,但显然相当复杂,无法解决100%的情况。如前所述,我在AWS中工作,因此可以使用他们的工具。我很想知道是否有更好的方法来解决这个问题。谢谢!
最佳答案
您可能在对供应商查询值的同时对持有的事务使用Connection.TRANSACTION_SERIALIZABLE
事务隔离级别。使用该命令将锁定数据库行,并阻止该行的所有选择,直到您提交事务为止。数据库将处理所有等待您的事件,您可以将异常情况作为锁定等待超时SQLException处理。