在循环中执行插入时出现 javax.persistence.TransactionRequiredException

标签 java spring hibernate jta

我有一个使用 Spring、Hibernate 和 JTA 的应用程序。

我们收到了一个数据大于预期的请求(10000 个元素),一般请求是 10-100 个元素。

在处理这个请求时,我们尝试在数据库中为每个元素插入一条记录,这是在 for 循环中完成的

伪代码:

processRecords( list){

for (Element element: list){

dao.findBy -- This takes around 100 ms

-- some other checks and logic

dao.add(element); -- This takes around 150 ms
dao.flush();
 }

}

这个 block 需要很多时间来处理记录然后我得到 *

"javax.persistence.TransactionRequiredException: no transaction is in progress"

*

我尝试将刷新移出 for 循环,没有帮助,我尝试研究 hibernate 的批量插入,但这是一个具有大量自定义的大型应用程序,我不认为这是一个选项,因为它会影响整个应用程序,我还尝试查找在哪里配置了事务持续时间,我唯一能找到的地方是在 weblogic 上的 JTA 中,它被设置为 480 秒。

任何关于如何解决这种情况的指标将不胜感激。

编辑: 增加 weblogic 中的 JTA Timeout 暂时解决了这个问题,但我将它设置为一个非常大的值 5000 秒,无论如何可以提高性能,因为我只是插入 8K 记录(我知道批处理是一种选择,但是有在自定义“框架”中有一些限制)

最佳答案

使用@Transactional 来控制事务。

  1. 确保不使用 PROPAGATION_NEVER 自动启动事务
  2. 通过使用 REQUIRES_NEW 调用服务方法,为列表中的每个项目(或列表中的项目子集)启动新事务。

在第二步中,您可能想要调用另一个 bean,以便实际提取事务注释,不记得这是否适用于同一对象的方法。

关于在循环中执行插入时出现 javax.persistence.TransactionRequiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41131941/

相关文章:

java - Vaadin - 在 View 之间传递数据

spring - Spring无法使用Tomcat提供的JNDI DataSource?

spring - 在tomcat同根路径下部署多个war文件

hibernate - 子树意外结束

spring - Hibernate 配置多个数据源和多个 session 工厂

JavaFX 不确定进度对话框覆盖

日期对象中的 Java DateFormat

java - weblogic错误500--内部服务器错误

java - Spring 休息API : Password encoding

hibernate - 如何将现有的 Hibernate ORM 与 Cassandra 集成?