Grails :: Я ненавижу и просто не могу понять: «Сеанс гибернации не связан с текущим потоком» - PullRequest
4 голосов
/ 21 февраля 2011

Простой сценарий, но заставляющий меня биться головой об стену, так как я не могу понять, что «Сессия Hibernate не привязана к текущей теме».

Вариант использования для реализации:

def records = SomeDomain.list()

//split records into equal size chunks.

def chunks = [][] // <- add records to chunks

//now process each chunk in a different thread

chunks.each { aChunk ->
   Thread.start {
     singletonInjectedService # processs(aChunk)
   }
}

Как этого добиться в Граале? Неважно, что это за контейнер, Quartz Job, который хочет обрабатывать «записи» в нескольких потоках, или Service, который хочет обрабатывать «записи» в нескольких потоках, он просто завершается неудачно с «Нет спящего режима, привязанного к текущему потоку».

Законный вариант использования, но жаль, что он просто не работает для меня вообще.

1 Ответ

13 голосов
/ 21 февраля 2011

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

Когда вы управляете своими собственными потоками, происходят странные вещи.

Тем не менее, существует метод withTransaction, доступный для классов домена, документированный здесь:позаботься о своей проблеме.

Также есть плагин фоновых потоков, который можно увидеть здесь http://grails.org/BackgroundThread+Plugin, который утверждает, что позаботился о проблеме спящего режима для вас.

...