gpt4 book ai didi

spring - Spring多线程与 hibernate

转载 作者:行者123 更新时间:2023-12-03 13:18:41 24 4
gpt4 key购买 nike

一些简短的版本信息:具有Hibernate 5和Java 8的Spring Boot 2.1。

我们尝试做一个多线程处理步骤,其中我们使用Spring服务来处理 hibernate 实体。基本上看起来像下面的代码片段。

   ExecutorService executorService = Executors.newFixedThreadPool(4);


List<Callable<String>> executions = new ArrayList<>();
for (String partition : partitions) {
Callable<String> partitionExecution = () -> {
step.execute(partition);
return partition;
};
executions.add(partitionExecution);
}

executorService.invokeAll(executions);

问题在于创建的线程中无法以某种方式使用hibernat session 。我们得到以下异常:
org.hibernate.LazyInitializationException: 
failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session

如果我删除了多线程部分(即删除了执行程序服务),则一切正常。

我们已经尝试了以下方法:
  • 使用 Spring 管理的ThreadPoolTask​​Executor
  • 将@Transactional放在方法/类的顶部(从另一个类连接并在那儿调用,因此基本上应该可以工作)

    任何提示/建议表示赞赏:)

  • 最佳答案

    我想出了一个工作版本。基本上,我让Spring使用Async注释生成线程本身。这样,创建的线程将获得所需的 hibernate session 。

    我创建了一个Spring服务,该服务通过async方法进行委派。

    @Component
    public AsyncDelegate {

    @Async
    @Transactional
    public Future delegate(Step step, String partition){
    step.execute(partition);
    return new AsyncResult(partition);
    }
    }

    并修改了这样的初始代码:
        @Autowired
    AsyncDelegate asyncDelegate;

    List<Future> executions = new ArrayList<>();
    for (String partition : partitions) {
    executions.add(asyncDelegate.delegate(step, partition));
    }

    关于spring - Spring多线程与 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60304699/

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