2010-08-24 10 views
15

Sto scrivendo un'applicazione multi-thread in Grails e i thread aggiuntivi devono accedere a GORM/Hibernate. Quando provano ad accedere a GORM viene visualizzato l'errore "org.hibernate.HibernateException: nessuna sessione di sospensione legata al thread e la configurazione non consente la creazione di quella non transazionale qui".Come associare una sessione di sospensione a un thread in Grails?

OK abbastanza giusto, qualcuno può guidarmi sul modo migliore per impostare i thread per avere accesso? Il messaggio di errore sembra quasi dover cambiare alcune opzioni di configurazione, tuttavia, non è così semplice ...

risposta

14
+6

I secondi due collegamenti sono interrotti, la posizione è cambiata? – Kevin

14

È necessario inserire qualsiasi chiamata GORM in una chiusura withTransaction. Un esempio tratto da una discussione di multi filettatura a https://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/

singolo filettato

user = User.findByUsername(photo.username) 

multi threaded

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

Questo è probabilmente il modo più semplice per l'utilizzo di thread occasionale. – Joseph

1

withNewSession funzionerà anche. Nel mio caso, ho aggiornamenti a bassa priorità in cui l'ultimo aggiornamento può sempre "vincere". version: false è anche importante al fine di evitare lo StaleObjectException:

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

Questa è la risposta che stavo cercando. _Way_ meglio dell'uso di 'withTransaction' se stai facendo degli aggiornamenti sullo sfondo che vuoi apparire mentre vengono creati. – aroth