10

有些东西没有被冲洗掉。正在发生的事情的简化示例:

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

4

2 回答 2

12

Gpars 是一个多线程工具,注入到您的域类中的休眠会话不是线程安全的。

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

  • withNewSession
  • withNewTransaction

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

于 2012-12-31T02:21:17.413 回答
1

我最近有一个类似的问题。据我了解,似乎线程无法绑定休眠会话,我也无法让它工作。如果您真的不需要它,请尝试编写处理 GPar 之外的持久性的代码。这就是我让它工作的方式。

于 2012-12-30T05:51:00.043 回答