2008-10-28 5 views
12

मेरे पास एक बहुत ही दृढ़ता कॉल के साथ एक विधि थी जिसने एक हाइबरनेट सत्र का उपयोग किया, यह काम किया, ठीक था। लेकिन मुझे बहुउद्देश्यीय कारणों से लूप के अंदर एक सामग्री से एक विधि निकालने, इस विधि को दोबारा करने की जरूरत है। तब मैंने इस विधि के साथ एक कक्षा बनाई। यह एक सामान्य रिफैक्टरिंग की तरह है, लेकिन इस विधि कॉल के अंदर nHibernate सत्र टूट गया है, संदर्भ के बिना, मैंने इसे किसी भी समय अंतिम रूप दिया नहीं है। मल्टीथ्रेडिंग के साथ nHibernate समस्या है? यहां तक ​​कि जब मेरे पास केवल एक और थ्रेड निष्पादन होता है, तो मुझे भी यही समस्या है।nHibernate सत्र और multithreading

मैं सत्र फैक्ट्री और फैस्केड पैटर्न के माध्यम से nHibernate सत्र का उपयोग करता हूं, इसका मतलब है, सत्र इन वस्तुओं का एक क्षेत्र नहीं है, यह सत्र कारखाना में वैश्विक है।


यह बनाना और अधिक स्पष्ट एक छोटा सा:

से पहले:

Method() 
{ 
... persistence calls 
foreach(Thing..) 
{ 
...persistence calls for each thing (1) 
} 
... 
} 

के बाद:

Method() 
{ 
... persistence calls 
foreach(Thing..) 
{ 
create a thingResolver object with some data 
open a new thread with thingResolver.Method (1) 
starts this thread 
} 
.. waits for finishing threads and continues 
} 

हमारा nHibernate सत्र फैक्ट्री थ्रेड-जागरूक है, और प्रति थ्रेड nHibernate सत्र स्टोर/पुनर्प्राप्त करता है। यह अच्छी तरह से अब काम कर रहा है;)

उत्तर

17

सत्र रहे डिजाइन द्वारा NHibernate में थ्रेड नहीं सुरक्षित। तो यह तब तक ठीक होना चाहिए जब तक आपके पास सत्र केवल एक थ्रेड द्वारा उपयोग किया जाता है।

मुझे यकीन है कि क्या आप thingResolver करता हो नहीं कर रहा हूँ, लेकिन अगर यह एक ही सत्र आप मूल सूत्र में बना लिया है पर कुछ दृढ़ता कॉल करता है - यह सबसे शायद अपनी समस्याओं का कारण है, तो आप बना सकते हैं यदि आपका धारणा सच है तो यह आपके नए धागे में एक अलग सत्र है ताकि यह प्रति थ्रेड सत्र हो।

NHibernate संदर्भ अनुभाग 10,2

http://nhibernate.info/doc/nh/en/index.html#transactions

+0

धन्यवाद Aleksey। मुझे यह करने में समस्या होगी (किसी अन्य सत्र के साथ काम करें), क्योंकि यह मेरे डिजाइन का उल्लंघन करता है, मैं इस बहुप्रचारित चीज़ को भूलने के बारे में सोच रहा हूं। –

+0

वास्तव में, मेरा सत्र कारखाना मजबूत है और प्रति थ्रेड सत्र कर सकता है, इसकी कामकाजी: डी –

+1

प्रलेखन के लिए अद्यतन लिंक http://nhforge.org/doc/nh/en/index.html#transactions – AlfeG

0

में यह है, तो आप जब तक आप प्रत्येक थ्रेड के लिए एक अलग NHibernate सत्र के रूप में एक से अधिक थ्रेड के लिए एक NHibernate SessionFactory हो सकता है।

https://forum.hibernate.org/viewtopic.php?p=2373236&sid=db537baa5a57e3968abdda5cceec2a24

समाधान LocaldataStoreSlot पर सत्र स्टोर करने के लिए है, इस तरह आप एक सत्र-प्रति हो सकता है:

यहाँ एक उदाहरण है कि अपवाद दे देंगे क्योंकि यह प्रत्येक थ्रेड के लिए एक ही सत्र का उपयोग करता है -रेक्वेस्ट मॉडल।

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

  • कोई संबंधित समस्या नहीं^_^