Как связать Hibernate Session с потоком в Grails? - PullRequest
16 голосов
/ 24 августа 2010

Я пишу многопоточное приложение на Grails, и дополнительным потокам нужен доступ к GORM / Hibernate. Когда они пытаются получить доступ к GORM, я получаю сообщение об ошибке «org.hibernate.HibernateException: ни один сеанс Hibernate не привязан к потоку, и конфигурация не позволяет создавать нетранзакционный сеанс здесь».

Хорошо, честно, кто-нибудь может подсказать мне, как настроить потоки для доступа? Сообщение об ошибке звучит так, будто вам просто нужно изменить некоторые параметры конфигурации, но я чувствую, что это не так просто ...

Ответы [ 3 ]

14 голосов
/ 25 августа 2010

В приложениях Grails есть компонент, называемый «persistenceInterceptor», который можно использовать для этого.

См. Этот пример из плагина JMS о том, как его использовать:

http://github.com/gpc/grails-jms/blob/master/src/groovy/grails/plugin/jms/listener/adapter/PersistenceContextAwareListenerAdapter.groovy#L21

Вот интерфейс:

https://github.com/grails/grails-core/blob/master/grails-core/src/main/groovy/grails/persistence/support/PersistenceContextInterceptor.java

И Hibernate impl:

https://github.com/grails/grails-data-mapping/blob/master/grails-datastore-gorm-support/src/main/groovy/org/grails/orm/hibernate4/support/HibernatePersistenceContextInterceptor.java

14 голосов
/ 24 августа 2010

Вы должны поместить любые вызовы GORM в закрытие withTransaction. Пример взят из обсуждения многопоточности на https://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/

Однопоточная

user = User.findByUsername( photo.username )

многопоточный

User.withTransaction{
user = User.findByUsername( photo.username )
}
2 голосов
/ 09 февраля 2017

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
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...