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