2012-12-29 29 views
10

Bir şeyler kızarmıyor. bitenlerden bir basitleştirilmiş bir örnek:Kepçeler, GParlar ve veri kalıcılığı

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 { 
      ... 

Bu çıkışlar: Veri inat veya bu bir hata olup olmadığını yapmak için Oturum ve İşlem ile bir şeyler yapmak zorunda olmadığını

Number of people after save: 1 
Number of people after withPool: 1 
Number of people after eachParallel: 0 

anlamıyorum GPars'da. Temeldeki hazırda bekletme seviyesinde neler oluyor?

Yakın zamanda oluşturulmuş Kişinin paralel kapatma içinde görünmesini istiyorum.

+0

Bunu nasıl aştın? @Alison – Ramisetti

cevap

12

Gpars çok parçalı bir araçtır ve etki alanı sınıfınıza enjekte edilen hazırda bekleme oturumu iş parçacığı için güvenli değildir.

bu yöntemleri kullanarak veya doğrudan SessionFactory çağırma deneyin:

  • withNewSession
  • withNewTransaction

her iş parçacığı için bir oturum açma, son derece pahalıya mal olabilir dikkat ve yeni bağlantılar ile veritabanı sel olabilir .

+2

+1 "oturum ... iş parçacığı güvenli değil" Teşekkürler! Bu cevap, eşzamanlılıktan güvenli olması gereken bir yerde neden bir kilite ihtiyacım olduğunu gösteriyor. Transaction ile withFewSession kullanıyorum. – Alison

1

Yakın zamanda benzer bir sorunum var. Anladığım kadarıyla, iş parçacığı hazırda bekleme oturumunu bağlayamıyor gibi görünüyor, ben de işe yaramadı. Gerçekten buna ihtiyacınız yoksa, Doktorların kalıcılığıyla ilgili kod yazmayı deneyin. İşe almamın yolu budur.