2012-12-29 10 views
10

Coś się nie zaczerwieniło. Uproszczony przykład tego, co się dzieje:Grails, GPars i utrwalanie danych

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

This wyjścia:

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

Nie rozumiem, czy mam coś zrobić z sesji i Transaction aby dane utrzymują się lub jeśli jest to błąd w GPars. Co się dzieje na podstawowym poziomie hibernacji?

Chcę, aby niedawno utworzona osoba była widoczna w ramach równoległego zamknięcia.

+0

jak udało ci się to przezwyciężyć? @Alison – Ramisetti

Odpowiedz

12

Gpars to narzędzie wielowątkowe, a sesja hibernacji wstrzyknięta w domenie klasy nie jest bezpieczna dla wątków.

Spróbuj użyć tych metod lub powołując SessionFactory bezpośrednio:

  • withNewSession
  • withNewTransaction

Pamiętaj, że otwierając sesję dla każdego wątku może być bardzo kosztowna i może zalać swoją bazę danych z nowych połączeń .

+2

+1 "sesja ... nie jest wątkowa" Dzięki! To odpowiada, dlaczego potrzebowałem blokady w miejscu, które powinno być bezpieczne przed współbieżnością. Używam zNewSession zamiast withTransaction. – Alison

1

Niedawno miałem podobny problem. Jak zrozumiałem, wygląda na to, że wątki nie mogły powiązać sesji hibernacji, nie mogę jej również uruchomić. Jeśli naprawdę tego nie potrzebujesz, spróbuj napisać kod dotyczący wytrwałości poza GPars. W ten sposób działa.