2010-08-24 6 views
15

Ich schreibe eine Multithread-Anwendung in Grails und die zusätzlichen Threads benötigen Zugriff auf GORM/Hibernate. Wenn sie versuchen, auf GORM zuzugreifen, erhalte ich den Fehler "org.hibernate.HibernateException: Keine an den Thread gebundene Hibernate-Sitzung, und die Konfiguration erlaubt hier nicht die Erstellung von nicht-transaktionalen Sitzungen".Wie verbinde ich eine Hibernate-Sitzung mit einem Thread in Grails?

OK fair genug, kann mir jemand auf dem besten Weg helfen, die Threads einzurichten, um Zugang zu haben? Die Fehlermeldung klingt fast so, als müssten Sie nur einige Konfigurationsoptionen ändern, aber ich denke, es ist nicht so einfach ...

Antwort

14
+6

Zweite zwei Links sind gebrochen, hat sich der Standort geändert? – Kevin

14

Sie müssen alle GORM-Aufrufe in einen withTransaction-Abschluss einfügen. Ein Beispiel aus einer Diskussion über Multi-Threading, die am https://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/

Einzelgewinde

user = User.findByUsername(photo.username) 

Gewinde Multi
User.withTransaction{ 
user = User.findByUsername(photo.username) 
} 
+0

Dies ist wahrscheinlich der einfachste Weg für die gelegentliche Thread-Nutzung. – Joseph

1

withNewSession wird auch funktionieren. In meinem Fall habe ich Updates mit niedriger Priorität, bei denen das letzte Update immer "gewinnen" kann. version: false ist auch hier wichtig, um die StaleObjectException zu vermeiden:

 Thread.start { 
     try { 
      Widget.withNewSession { 
       xxx() 
       log.info "Asynchronously did some updates." 
      } 
     } catch (Exception ex) { 
      log.error "Failed to asynchronously do something...", ex 
     } 
    } 
+0

Das ist die Antwort, nach der ich gesucht habe. _Way_ besser als mit 'mitTransaction', wenn Sie im Hintergrund einige Aktualisierungen vornehmen, die so aussehen sollen, wie sie erstellt wurden. – aroth