如何在@Transactional注释方法中向DB提交状态?

时间:2014-07-23 02:24:10

标签: java spring hibernate jpa transactions

我在Spring中通过Hibernate使用JPA。我需要在@Transactional方法中处理大量数据。这个过程可能需要一段时间,所以我想在前端查询并显示进度。 "已处理了1000件物品中的50件"等。

但是,在@Transactional注释方法中处理数据期间,如何将进程状态提交到DB中?

它可以通过远程呼叫,任何其他更好的方式工作吗?

提前致谢。

3 个答案:

答案 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的干净架构有关。