Grails、GPars 和数据持久性
Posted
技术标签:
【中文标题】Grails、GPars 和数据持久性【英文标题】:Grails, GPars and data persistence 【发布时间】:2012-12-14 06:58:17 【问题描述】:有些东西没有被刷新。正在发生的事情的简化示例:
def testDemo()
def person = new Person(...)
person.save(flush: true)
println "Number of people after save: " + Person.all.size()
def dummyList = [1, 2, 3, 4, 5]
GParsPool.withPool num ->
println "Number of people after withPool: " + Person.all.size()
dummyList.eachParallel
println "Number of people after eachParallel " + Person.all.size()
Person.withTransaction
...
这个输出:
Number of people after save: 1
Number of people after withPool: 1
Number of people after eachParallel: 0
我不明白我是否必须对 Session 和 Transaction 做一些事情以使数据保持不变,或者这是否是 GPars 中的错误。底层休眠级别发生了什么?
我希望最近创建的 Person 在并行闭包中可见。
【问题讨论】:
你是如何克服这个问题的? @艾莉森 【参考方案1】:Gpars 是一个多线程工具,注入到您的域类中的休眠会话不是线程安全的。
尝试使用这些方法或直接调用SessionFactory:
withNewSession withNewTransaction请注意,为每个线程打开一个会话可能会非常昂贵,并且可能会用新的连接淹没您的数据库。
【讨论】:
+1 "session ... 不是线程安全的" 谢谢!这回答了为什么我需要在一个应该避免并发的地方加锁。我正在使用 withNewSession 而不是 withTransaction。【参考方案2】:我最近遇到了类似的问题。据我了解,似乎线程无法绑定休眠会话,我也无法让它工作。如果您真的不需要它,请尝试编写处理 GPar 之外的持久性的代码。这就是我让它工作的方式。
【讨论】:
以上是关于Grails、GPars 和数据持久性的主要内容,如果未能解决你的问题,请参考以下文章