如何处理事务在异步调用



由于应用程序的速度较慢,我们将一些长时间运行的查询设置为异步。问题是这些是单个事务的一部分,但如果这些查询/例程失败,我需要回滚一切。如何做到这一点?该应用程序是使用JDBC oracle和java 8的遗留应用程序。我还想知道在Springboot, jpa应用程序中是否有对此的支持。

提前感谢。

  • 不要尝试同时从多个线程与同一个DB连接进行交互。JDBC的连接系统不规范让你这样做。
  • 事务属于单个连接。你不能多次涂抹它。
  • 确保"它被全部回滚"的明显方法是拥有一个长生存期事务(但见后面)。

将这3个方面结合起来,你最终会得到:至少,的所有工作要么都需要发生,要么都不发生(即一个事务)。

任何其他基本方法都不起作用或没有用;没有必要冻结主线程来等待异步任务(只需当场执行异步任务;将代码移到另一个线程并不能神奇地使它运行得更快。

然而,事务不仅存在很长时间,而且会对数据库进行大量更改,这是它自己的问题,但是我们现在正在研究特定查询批次和特定数据库引擎、版本、索引和数据的性能特征。因为有那么多未知因素,很难回答具体问题。

有很多方法可以设计您的DB来处理这个问题(主要涉及到一个表示计算的表,并用一行表示计算是否完成)。只要你没有完成,不要将它设置为'completed',你所有的查询都应该忽略非完整的结果。在启动时,删除(并让它级联)任何不完整的结果:这些必须是在服务器崩溃之前完成的半生不熟的工作,现在您已经重新启动了它)。这可能不是正确的答案,只是要确保您知道也存在这样的选项。

作为一个一般的经验法则,对付"我们的代码已经被观察到运行得太慢了"的问题。用"让一切都异步"是行不通的。异步使代码更难阅读,更难调试,并且不能使程序运行得更快。你所能做的就是在用户等待的过程中播放一些电梯音乐或更实用的内容:一个进度条或诸如此类的内容来安抚他们。实际上,通过将告诉用户正在发生的事情的比特生成到一个单独的线程中,而不是将工作本身异步化,这通常更容易。使你的算法更好和/或修复你的数据库索引定义。你也可以在网上搜索;运行查询的EXPLAIN变体,使DB告诉您它是否正在使用任何表扫描(即在回答查询之前遍历整个数据集)。

如果你需要这些部分中的任何一部分的帮助(向用户展示正在发生的事情,而不是冻结网页或冻结GUI/如何优化数据库查询),在网上搜索这些信息,有大量的教程。确保包含前端技术;Java可以用于swing应用程序、javafx、android,据最新统计,大约有100个web框架。

相关内容

  • 没有找到相关文章

最新更新