2010-08-24 7 views
15

मैं Grails में एक बहु थ्रेडेड आवेदन लिख रहा हूं और अतिरिक्त धागे को GORM/Hibernate तक पहुंच की आवश्यकता है। जब वे GORM तक पहुंचने का प्रयास करते हैं तो मुझे त्रुटि मिलती है "org.hibernate.HibernateException: कोई हाइबरनेट सत्र थ्रेड से बंधे नहीं है, और कॉन्फ़िगरेशन गैर-लेनदेन वाले किसी के निर्माण की अनुमति नहीं देता है"।मैं Grails में एक धागे के लिए एक हाइबरनेट सत्र कैसे बांधूं?

ठीक है पर्याप्त है, क्या कोई मुझे धागे को एक्सेस करने के लिए सेट करने के सर्वोत्तम तरीके पर मार्गदर्शन कर सकता है? त्रुटि संदेश लगभग लगता है जैसे आपको बस कुछ कॉन्फ़िगरेशन विकल्पों को बदलने की आवश्यकता है, मुझे लगता है कि यह इतना आसान नहीं है ...

उत्तर

14

पिरोया "persistenceInterceptor" कहा जाता है Grails अनुप्रयोगों में एक सेम है कि के लिए इस्तेमाल किया जा सकता है इस।

कि यह कैसे उपयोग करने पर JMS प्लगइन से इस उदाहरण देखें:

https://github.com/grails/grails-core/blob/master/grails-core/src/main/groovy/grails/persistence/support/PersistenceContextInterceptor.java

और हाइबरनेट impl:

https://github.com/grails/grails-data-mapping/blob/master/grails-datastore-gorm-support/src/main/groovy/org/grails/orm/hibernate4/support/HibernatePersistenceContextInterceptor.java

http://github.com/gpc/grails-jms/blob/master/src/groovy/grails/plugin/jms/listener/adapter/PersistenceContextAwareListenerAdapter.groovy#L21

यहां इंटरफ़ेस है

+6

दूसरे दो लिंक टूटे हैं, क्या स्थान बदल गया है? – Kevin

14

आपको किसी भी GORM कॉल को ट्रांज़ेक्शन क्लोजर में रखना होगा। https://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/

एकल में बहु सूत्रण की चर्चा से लिया एक उदाहरण पिरोया

user = User.findByUsername(photo.username) 

बहु

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

यह कभी-कभी थ्रेड उपयोग के लिए सबसे आसान तरीका है। – Joseph

1

न्यूवेशन के साथ भी काम करेगा। मेरे मामले में, मेरे पास कम प्राथमिकता अपडेट हैं जहां अंतिम अपडेट हमेशा "जीत" सकता है। StaleObjectException से बचने के लिए version: false भी महत्वपूर्ण है:

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

यह वह उत्तर है जिसे मैं ढूंढ रहा था। _Way_ 'withTransaction' का उपयोग करने से बेहतर है यदि आप पृष्ठभूमि में कुछ अपडेट कर रहे हैं जिन्हें आप दिखाना चाहते हैं। – aroth

संबंधित मुद्दे