Как запретить @Transactional закрывать транзакцию, если новый поток запущен внутри аннотированного метода?

#java #spring #hibernate #transactions

#java #весна #спящий режим #транзакции

Вопрос:

Наличие следующей реализации сервиса:

 @Transactional
   public Void process(Data data)
   {
      ExecutorService executorService = Executors.newSingleThreadExecutor();
      Connection connection = HibernateUtil.getConnection(sessionFactory.getCurrentSession());
      future = executorService.submit(new ProcessJob(connection));
      return null;
   }
  

Поток запускается успешно, но вскоре завершается сбоем с исключением:

прокси-сервер подключения недоступен после завершения транзакции org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:42)

Есть ли какой-либо способ предотвратить закрытие транзакции до завершения запущенного потока?

Комментарии:

1. Вы не должны совместно использовать соединение или транзакцию между потоками. Также, если вам нужно подождать (потому что это то, что вы в конечном итоге делаете), какова цель асинхронного материала. Кроме того, ваш код также выглядит так, как будто вы работаете с Spring и Hibernate, создаете свои собственные потоки, а также сохраняете состояние в одноэлементном коде, что вам вообще не следует делать.

2. Если вы получите другое соединение, используя SessionFactory.OpenSession() вместо SessionFactory.getCurrentSession(), это может решить вашу проблему.