Hibernate Grails、GPAR和数据持久性

Hibernate Grails、GPAR和数据持久性,hibernate,grails,gpars,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 -> p

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

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
我不明白我是否必须对会话和事务做些什么才能使数据持久化,或者这是GPAR中的一个错误。在底层的hibernate级别发生了什么


我希望最近创建的人在并行闭包中可见。

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

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

尝试使用以下方法或直接调用SessionFactory:

  • 带新闻会话
  • 有了新的交易

请注意,为每个线程打开会话的成本可能非常高,并且可能会使数据库中充斥着新的连接

+1“会话…不是线程安全的”谢谢!这就解释了为什么我需要在一个本应避免并发的地方设置锁。我使用的是withNewSession而不是Transaction。您是如何克服这一问题的@艾莉森