Spring:使用事务数据库方法处理长时间运行的 Web 服务调用的最佳方法?

发布于 2024-11-03 02:35:26 字数 372 浏览 1 评论 0原文

我们有一个服务方法,它大约执行以下操作:

@Transactional
public void serviceMethod(...){
   for(Item i : bunchOfItems){
      webServices.webServiceCall(...);
      dao.daoUpdateMethod(...);
   }
}

问题是,一旦发生更新,数据库就会在表上锁定持续时间< strong>事务(Web 服务调用平均每次 5 秒)。当然,Web 服务调用或 DAO 调用中的任何异常都应该导致完全回滚。

解决这种情况的最佳方法是什么?

We have a service method which does approximately the following:

@Transactional
public void serviceMethod(...){
   for(Item i : bunchOfItems){
      webServices.webServiceCall(...);
      dao.daoUpdateMethod(...);
   }
}

The problem is that as soon as an update occurs the DB is holding a lock on the table for the duration of the Transaction (webservice calls average 5 sec each). Any exception in a webservice call or DAO call should, of course, cause a full rollback.

What's the best approach to this situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

恍梦境° 2024-11-10 02:35:26

如果 Web 服务调用不依赖于您在先前迭代中可能更新的内容,则您可以在第一遍中进行所有 Web 服务调用并将结果收集到内存中,然后启动所有更新的事务。这将使您的事务变得更短,并且由于我假设 Web 服务调用无论如何都不是事务性的,因此它不会影响数据的一致性。

If the web service call doesn't depend on what you might have updated in a previous iteration, you could make all your web service calls in a first pass and collect the results in memory, and then start a transaction for all your updates. This would make your transaction much shorter and, since I assume the web service call isn't transactional anyway, it wouldn't affect the coherence of your data.

我不是你的备胎 2024-11-10 02:35:26

因为我假设 Web 服务调用不是以任何方式进行事务的,所以您可以在启动事务来存储某些内容之前执行所有 Web 服务调用。

您可以用不同的方式完成整个工作:

  • 顺序 - 2 个循环、一个事务和一点内存:循环遍历所有 Web 服务调用,将结果存储在数组中,打开事务,然后循环遍历所有结果并按
  • 顺序存储它们 - 一个循环和 n 事务:在循环中,首先为一项调用 Web 服务,然后启动一个新事务并并行存储它(循环结束)
  • - 并行执行 Web 服务调用 - 您可以将其与提到的两种方式结合起来上面喜欢JB尼泽提出了他的答案

Because I assume the webservice call is not transactional in any way, you can do all webservice calls before you start the transaction to store something.

You can do the whole stuff in different ways:

  • sequential - 2 loops, one transaction and a bit memory: loop trough all webservice invocation store the results in an array, open the transaction and then loop trough all results and store them
  • sequential - one loop, and n transaction: in the loop, first call the web service for one item, then start a new transaction and store it (loop end)
  • in parallel - do the web service invokation in parallel - you can combine it with the two ways mentioned above like JB Nizet suggested his answer
青巷忧颜 2024-11-10 02:35:26

通过在数据库中使用 MVCC 模式,我可以完全避免锁定更新。完成此操作后,我可以执行相同的测试,而不会出现任何锁争用。

MVCC 模式允许在未提交的更新仍在进行时进行读取。

By employing MVCC mode in the database I can avoid locking on updates altogether. After doing this I can perform the same test without any lock contention.

MVCC mode allows reads to occur while an uncommitted update is still in progress.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文