spring - Spring多线程与 hibernate

标签 spring multithreading hibernate spring-boot

一些简短的版本信息:具有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/

    相关文章:

    java - 使用 iText 从多个模板创建单个 PDF 文件

    java.lang.VerifyError : Stack map does not match the one at exception handle

    python - 简化Python中的线程

    c++ - 在锁内对 STL 容器执行耗时操作

    java - @Transactional 继续异常处理

    java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name (controller)

    spring - 如何使用 hibernate 和 spring 在 Tomcat 7 中配置 MySQL 数据源?

    c++ - 多线程环境中的扩展 OVERLAPPED 对象池 : where and how to use locking efficiently

    java - 如何使用父实体的组合键进行 JPA @OneToMany 单向映射?

    java - Spring hibernate 错误