2012-12-29 19 views
10

Etwas wird nicht gespült. Ein vereinfachtes Beispiel dafür, was geschieht:Grails, GPars und Datenpersistenz

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

Diese Ausgänge:

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

Ich verstehe nicht, wenn ich etwas mit Session und Transaktion tun müssen, um die Daten zu machen anhalten oder wenn dies ein Fehler ist in GPars. Was passiert hier auf der zugrunde liegenden Hibernate-Ebene?

Ich möchte die kürzlich erstellte Person innerhalb der parallelen Schließung sichtbar sein.

+0

Wie haben Sie das überwunden? @Alison – Ramisetti

Antwort

12

Gpars ist ein Multithread-Tool und die in Ihre Domänenklasse injizierte Hibernate-Sitzung ist nicht Thread-sicher.

Versuchen Sie diese Methoden verwenden oder Aufrufen Session direkt:

  • withNewSession
  • withNewTransaction

Beachten Sie, dass eine Sitzung für jeden Thread öffnen kann sehr kostspielig sein und könnte Ihre Datenbank mit neuen Verbindungen überfluten .

+2

+1 "Sitzung ... ist nicht Thread-sicher" Danke! Dies beantwortet, warum ich eine Sperre an einem Ort brauchte, der vor Nebenläufigkeit sicher sein sollte. Ich verwende withNewSession anstelle vonTransaction. – Alison

1

Ich habe vor kurzem ein ähnliches Problem. Wie ich verstanden habe, scheint es so zu sein, dass die Threads die Hibernate-Sitzung nicht binden konnten, ich kann sie auch nicht zum Laufen bringen. Wenn Sie es nicht wirklich brauchen, versuchen Sie, Code zu schreiben, der sich mit Persistenz aus GPars beschäftigt. So bekomme ich es zum Laufen.