一尘不染

Grails,GPar和数据持久性

hibernate

东西没有被冲走。发生的情况的简化示例:

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进行某些操作才能使数据持久化,或者这是GPar中的错误。在底层的hibernate级别发生了什么?

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


阅读 312

收藏
2020-06-20

共1个答案

一尘不染

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

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

  • withNewSession
  • withNewTransaction

请注意,为每个线程打开一个会话可能会非常耗费成本,并且可能会使您的数据库充满新的连接。

2020-06-20