Wie ich bind eine Hibernate-Session zu einem thread in Grails?
Schreibe ich eine multi-threaded-Anwendung in Grails und die zusätzlichen threads zugreifen müssen, GORM/Hibernate. Wenn Sie versuchen, Zugriff auf GORM bekomme ich die Fehlermeldung "org.hibernate.HibernateException: Keine Hibernate-Session gebunden, Faden, und die Konfiguration nicht erlaubt die Erstellung von non-transactional one here".
OK fair genug, kann jemand führe mich auf die beste Weg, um die Gewinde bis zum Zugang haben? Die Fehlermeldung klingt fast so brauchen Sie nur zu ändern, einige config-Optionen noch ich habe das Gefühl, es ist nicht so einfach...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine Bohne in Grails-Anwendungen, sogenannte "persistenceInterceptor", die HIERFÜR genutzt werden können.
Siehe dieses Beispiel aus der JMS-plugin auf, wie es zu benutzen:
http://github.com/gpc/grails-jms/blob/master/src/groovy/grails/plugin/jms/listener/adapter/PersistenceContextAwareListenerAdapter.groovy#L21
Hier ist die Schnittstelle:
https://github.com/grails/grails-core/blob/master/grails-core/src/main/groovy/grails/persistence/support/PersistenceContextInterceptor.java
- Und Hibernate-impl:
https://github.com/grails/grails-data-mapping/blob/master/grails-datastore-gorm-support/src/main/groovy/org/grails/orm/hibernate4/support/HibernatePersistenceContextInterceptor.java
Die Sie brauchen, um jede GORM ruft in einem withTransaction Schließung. Ein Beispiel aus einer Diskussion von multi-threading auf
https://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/
Single threaded
multi-threaded
withNewSession wird auch funktionieren. In meinem Fall habe ich die low-priority-updates, wo dem letzten update kann immer "gewinnen".
version: false
ist auch hier wichtig, um zu vermeiden, die StaleObjectException:withTransaction
wenn Sie einige updates im hintergrund, die Sie wollen, zu erscheinen, als Sie sind gemacht.