gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:04 27 4
gpt4 key购买 nike

我有一个使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com