如何将Hibernate会话绑定到Grails中的线程?

时间:2010-08-24 12:48:57

标签: grails gorm hibernate-session

我正在Grails中编写一个多线程应用程序,其他线程需要访问GORM / Hibernate。当他们尝试访问GORM时,我收到错误“org.hibernate.HibernateException:No Hibernate Session绑定到线程,配置不允许在这里创建非事务性的。”

确定公平,有人可以指导我设置线程的最佳方式来访问吗?错误消息几乎听起来像你只需要更改一些配置选项但我感觉,它不是那么简单......

3 个答案:

答案 0 :(得分:14)

您需要在withTransaction闭包中放置任何GORM调用。从多线程的讨论中得到的一个例子 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 )
}

答案 1 :(得分:14)

答案 2 :(得分:2)

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
        }
    }