2012-12-29 72 views
10

某些東西沒有被刷新。發生了什麼事的一個簡單的例子: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 

我不明白,如果我要做與會話和交易的東西,使數據保存,或者如果這是一個錯誤在GPars。底層hibernate層面上發生了什麼?

我希望最近創建的Person在並行閉包內可見。

+0

你是如何克服這一點的? @Alison – Ramisetti

回答

12

Gpars是一個多線程工具,注入到您的域類中的hibernate會話不是線程安全的。

嘗試使用這些方法或直接調用SessionFactory的:

  • withNewSession
  • withNewTransaction

要注意的是每個線程打開一個會話可以是非常昂貴的,並且可能充斥了新的連接數據庫。

+2

+1「會話...不是線程安全的」謝謝!這就解釋了爲什麼我需要在一個本來應該安全併發的地方加鎖。我使用withNewSession而不是withTransaction。 – Alison

1

我最近也有類似的問題。據我瞭解,它似乎是線程無法綁定休眠會話,我也無法讓它工作。如果你真的不需要它,試着編寫處理GPars持久性的代碼。這是我讓它工作的方式。