我正在Grails中编写一个多线程应用程序,其他线程需要访问GORM / Hibernate。当他们尝试访问GORM时,我收到错误“org.hibernate.HibernateException:No Hibernate Session绑定到线程,配置不允许在这里创建非事务性的。”
确定公平,有人可以指导我设置线程的最佳方式来访问吗?错误消息几乎听起来像你只需要更改一些配置选项但我感觉,它不是那么简单......
答案 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)
Grails应用程序中有一个名为“persistenceInterceptor”的bean可用于此目的。
请参阅JMS插件中有关如何使用它的示例:
这是界面:
和Hibernate impl:
答案 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
}
}