Как привязать транзакцию к нескольким потокам в Hibernate? - PullRequest
2 голосов
/ 07 апреля 2011

Изначально код был в следующей структуре, и он работал отлично -

Исходный код:

@Transactional
class foo
{
  void public work()
  {
      task1;
      task2;     
  }
}

Поскольку две задачи могут выполняться параллельно, мы реорганизовали их для размещения в двух потоках. Написал две задачи в разных потоках, запустил их параллельно и получил следующую ошибку при вызове соответствующего DAO

Сессия Hibernate не привязана к потоку, и конфигурация не позволяет создавать нетранзакционный сеанс здесь

Поскольку сеанс гибернации привязан к текущему потоку, это становится проблемой с дочерними потоками.

Рефакторинг код:

@Transactional
class foo
{
  void public work()
  {
      final Thread t1 = new Thread(new Job1());
      t1.start();

      final Thread t2 = new Thread(new Job2());
      t2.start();

      t1.join();
      t2.join(); 
  }

  class Job1
  {
     public void run()
     {
        task1;
     }   
  }

 class Job2
  {
     public void run()
     {
        task1;
     }   
  }

} * * тысяча двадцать-один

1 Ответ

5 голосов
/ 07 апреля 2011

Даже если возможно разделить управляемую Spring транзакцию между несколькими потоками, это не очень хорошая идея, поскольку транзакции Hibernate привязаны к Session s, а Hibernate Session не является поточно-ориентированным, поэтому вы не можете используйте один и тот же Session из нескольких потоков.

Возможно, было бы лучше спроектировать ваш код таким образом, чтобы все обращения к базе данных выполнялись одним потоком, а другие потоки выполняли только обработку данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...