我在Spring中通过Hibernate使用JPA。我需要在@Transactional方法中处理大量数据。这个过程可能需要一段时间,所以我想在前端查询并显示进度。 "已处理了1000件物品中的50件"等。
但是,在@Transactional注释方法中处理数据期间,如何将进程状态提交到DB中?
它可以通过远程呼叫,任何其他更好的方式工作吗?
提前致谢。
答案 0 :(得分:1)
您不需要查询更新状态。您可以使用JMS来推送进度通知,以便UI在事务仍在运行时使用它们(AJAX进度条+可以使用JMS更新的REST服务)。
如果您不想要JMS,则可以使用任何其他消息传递技术来执行此任务。您甚至可以使用Cache来设置更新进度并在其他线程中读取它。
您甚至可以编写由java.util.concurrent阻塞队列支持的自己的机制。
总而言之,您不需要数据库来监控该批处理作业的进度。
答案 1 :(得分:0)
@Transactional将在完成所有处理的记录后提交。因此,如果要逐批提交,则必须逐批调用db调用方法。
答案 2 :(得分:0)
我找到了来自Here.
的内容使用TransactionStatus
注入事务管理器获取TransactionAspectSupport.currentTransactionStatus()
到您的bean(假设您使用的是hibernate)尝试在事务管理器中调用doCommit(DefaultTransactionStatus status)
。
尝试这一点,不确定它是否会起作用,因为按照春季文档 Spring Doc
强烈建议您尽可能使用声明式方法进行回滚。如果您绝对需要程序化回滚,则可以使用程序化回滚,但它的使用方式与实现基于POJO的干净架构有关。