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

如何将Hibernate会话绑定到Grails中的线程?,grails,gorm,hibernate-session,Grails,Gorm,Hibernate Session,我正在用Grails编写一个多线程应用程序,其他线程需要访问GORM/Hibernate。当他们试图访问GORM时,我得到错误“org.hibernate.HibernateException:没有绑定到线程的hibernate会话,并且配置不允许在此创建非事务会话” 好吧,很公平,有人能告诉我设置线程访问的最佳方法吗?这个错误消息听起来像是您只需要更改一些配置选项,但我感觉,它并不是那么简单…您需要将任何GORM调用放入withTransaction闭包中。下面是一个关于多线程的讨论示例:

我正在用Grails编写一个多线程应用程序,其他线程需要访问GORM/Hibernate。当他们试图访问GORM时,我得到错误“org.hibernate.HibernateException:没有绑定到线程的hibernate会话,并且配置不允许在此创建非事务会话”


好吧,很公平,有人能告诉我设置线程访问的最佳方法吗?这个错误消息听起来像是您只需要更改一些配置选项,但我感觉,它并不是那么简单…

您需要将任何GORM调用放入withTransaction闭包中。下面是一个关于多线程的讨论示例:

单螺纹

user = User.findByUsername( photo.username )
多线程

User.withTransaction{
user = User.findByUsername( photo.username )
}

Grails应用程序中有一个名为“persistenceInterceptor”的bean可以用于此目的

有关如何使用JMS插件,请参见此示例:

以下是界面:

和Hibernate impl:


withNewSession也将起作用。在我的情况下,我有低优先级的更新,最后一次更新总是“赢”<代码>版本: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
        }
    }

第二个链接断了,位置改变了吗?这可能是偶尔使用线程的最简单方法。这就是我一直在寻找的答案。如果您在后台进行一些更新,并且希望在更新时显示这些更新,那么使用
with transaction
要比使用
要好得多。