Ответ 1
В приложениях Grails под названием "persistenceInterceptor" есть bean, которые могут быть использованы для этого.
См. этот пример из плагина JMS о том, как его использовать:
Вот интерфейс:
И Hibernate impl:
Я пишу многопоточное приложение в Grails, а дополнительные потоки нуждаются в доступе к GORM/Hibernate. Когда они пытаются получить доступ к GORM, я получаю сообщение об ошибке "org.hibernate.HibernateException: нет сеанса Hibernate Session, связанного с потоком, а конфигурация не позволяет создавать не транзакционные файлы здесь".
Хорошо честно, может ли кто-нибудь направить меня на лучший способ установить потоки для доступа? Сообщение об ошибке почти похоже на то, что вам просто нужно изменить некоторые параметры конфигурации, но я чувствую, это не так просто...
В приложениях Grails под названием "persistenceInterceptor" есть bean, которые могут быть использованы для этого.
См. этот пример из плагина JMS о том, как его использовать:
Вот интерфейс:
И Hibernate impl:
Вы должны поместить любые вызовы GORM в закрытие транзакции. Пример, взятый из обсуждения многопоточности в https://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/
Однопоточная
user = User.findByUsername( photo.username )
multi threaded
User.withTransaction{
user = User.findByUsername( photo.username )
}
withNewSession также будет работать. В моем случае у меня есть обновления с низким приоритетом, где последнее обновление всегда может "выиграть". version: false
также важен здесь, чтобы избежать исключения StaleObjectException:
Thread.start {
try {
Widget.withNewSession {
xxx()
log.info "Asynchronously did some updates."
}
} catch (Exception ex) {
log.error "Failed to asynchronously do something...", ex
}
}