Grails,GPars和数据持久性

时间:2012-12-29 06:09:34

标签: hibernate grails gpars

有些东西没有被冲洗。发生了什么的简化示例:

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在并行闭包中可见。

2 个答案:

答案 0 :(得分:12)

Gpars是一个多线程工具,在你的域类中注入的hibernate会话不是线程安全的。

尝试使用这些方法或直接调用SessionFactory:

  • withNewSession
  • withNewTransaction

请注意,为每个线程打开一个会话可能会非常昂贵,并且可能会使用新连接充斥您的数据库。

答案 1 :(得分:1)

我最近遇到了类似的问题。据我所知,似乎线程无法绑定hibernate会话,我也无法让它工作。如果你真的不需要它,请尝试编写处理GPars持久性的代码。这就是我开始工作的方式。