Некоторые короткие версии информации: Spring Boot 2.1 с Hibernate 5 и Java 8.
Мы пытаемся выполнить многопоточный этап обработки, на котором мы используем сервисы 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 почему-то недоступен в созданных потоках. Мы получаем следующее исключение:
org.hibernate.LazyInitializationException:
failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session
Если я удаляю в многопоточную часть (т.е. удаляю службу исполнителя), все работает нормально.
Мы уже попробовали следующее:
- Использовать управляемый пружиной ThreadPoolTaskExecutor
- Поместить @Transactional в начало метода / класса (который связан с другим классом и вызывается там, поэтому в основном должно работать)
Любые советы / предложения приветствуются:)