NHibernate ISession Flush: इसका उपयोग कब और कहाँ करना है और क्यों?


187

एक चीज जो मुझे अच्छी तरह से भ्रमित करती है, वह है session.Flush, के साथ संयोजन के रूप में session.Commitऔर session.Close

कभी-कभी session.Closeकाम करता है, जैसे, यह उन सभी परिवर्तनों को करता है जिनकी मुझे आवश्यकता है। मुझे पता है कि लेन-देन, या कई क्रिएट्स / अपडेट / डिलीट के साथ काम करने की एक इकाई के लिए मुझे प्रतिबद्ध का उपयोग करने की आवश्यकता है, ताकि त्रुटि होने पर मैं रोलबैक चुन सकूं।

लेकिन कभी-कभी मैं वास्तव में पीछे के तर्क से स्तब्ध हो जाता हूं session.Flush। मैंने ऐसे उदाहरण देखे हैं जहां आपके पास एक session.SaveOrUpdate()फ्लश है, लेकिन जब मैं फ्लश निकालता हूं तो यह वैसे भी ठीक काम करता है। कभी-कभी मैं फ्लश स्टेटमेंट पर यह कहते हुए त्रुटियों में भाग जाता हूं कि सत्र समाप्त हो गया है, और इसे हटाने से यह सुनिश्चित हो गया कि मैं उस त्रुटि में नहीं चला।

क्या किसी के पास एक अच्छी गाइडलाइन है कि फ्लश कहां या कब इस्तेमाल करें? मैंने इसके लिए NHibernate प्रलेखन की जाँच की है, लेकिन मैं अभी भी एक सीधा जवाब नहीं पा सकता हूँ।

जवाबों:


236

संक्षेप में:

  1. हमेशा लेनदेन का उपयोग करें
  2. उपयोग न करें Close(), इसके बजाय अपने कॉल को ISessionएक usingबयान के अंदर लपेटें या अपने ISession के जीवनचक्र को कहीं और प्रबंधित करें

से प्रलेखन :

समय-समय पर ISessionस्मृति में रखी गई वस्तुओं की स्थिति के साथ ADO.NET कनेक्शन की स्थिति को सिंक्रनाइज़ करने के लिए आवश्यक SQL कथनों को निष्पादित करेगा। यह प्रक्रिया, फ्लश, निम्न बिंदुओं पर डिफ़ॉल्ट रूप से होती है

  • Find()या के कुछ आह्वान सेEnumerable()
  • से NHibernate.ITransaction.Commit()
  • से ISession.Flush()

SQL कथन निम्न क्रम में जारी किए जाते हैं

  1. सभी इकाई सम्मिलन, उसी क्रम में संबंधित वस्तुओं का उपयोग करके बचाया गया था ISession.Save()
  2. सभी इकाई अद्यतन
  3. सभी संग्रह हटाए गए
  4. सभी संग्रह तत्व विलोपन, अद्यतन और सम्मिलन
  5. सभी संग्रह सम्मिलन
  6. सभी इकाई विलोपन, उसी क्रम में संबंधित वस्तुओं का उपयोग करके हटा दिया गया था ISession.Delete()

(अपवाद यह है कि मूल आईडी पीढ़ी का उपयोग करने वाली वस्तुओं को सहेजे जाने पर डाला जाता है।)

जब आप अन्वेषण करते हैं Flush(), तो सिवाय इसके बारे में कोई गारंटी नहीं है कि सत्र ADO.NET कॉल को निष्पादित करता है, केवल उसी क्रम में जिसमें वे निष्पादित किए जाते हैं । हालाँकि, NHibernate इस बात की गारंटी देता है कि ISession.Find(..)विधियाँ कभी भी बासी डेटा को वापस नहीं करेंगी; न ही वे गलत डेटा वापस करेंगे।

डिफ़ॉल्ट व्यवहार को बदलना संभव है ताकि फ्लश कम बार हो। FlushModeसमय के लिए प्रतिबद्ध में केवल फ्लश (और केवल जब NHibernate: वर्ग तीन अलग प्रकार परिभाषित करता है ITransaction, एपीआई प्रयोग किया जाता है) फ्लश स्वचालित रूप से नियमित, या कभी नहीं फ्लश जब तक समझाया का उपयोग कर Flush()स्पष्ट रूप से कहा जाता है। अंतिम मोड काम की लंबी चलने वाली इकाइयों के लिए उपयोगी है, जहां एक ISessionको लंबे समय तक खुला और डिस्कनेक्ट किया जाता है।

...

इस खंड को भी देखें :

एक सत्र के अंत में चार अलग-अलग चरण शामिल होते हैं:

  • सत्र फ्लश करें
  • लेन-देन करें
  • सत्र बंद करें
  • अपवादों को संभालें

सत्र फ्लशिंग

यदि आप ITransactionएपीआई का उपयोग करते हैं, तो आपको इस कदम के बारे में चिंता करने की आवश्यकता नहीं है। लेन-देन के लिए प्रतिबद्ध होने पर इसका प्रदर्शन किया जाएगा। अन्यथा आपको ISession.Flush()यह सुनिश्चित करने के लिए कॉल करना चाहिए कि सभी परिवर्तन डेटाबेस के साथ सिंक्रनाइज़ किए गए हैं।

डेटाबेस ट्रांजेक्शन करना

यदि आप NHibernate ITransaction API का उपयोग कर रहे हैं, तो ऐसा दिखता है:

tx.Commit(); // flush the session and commit the transaction

यदि आप ADO.NET लेनदेन का प्रबंधन स्वयं कर रहे हैं तो आपको ADO.NET लेनदेन को स्वयं करना चाहिए Commit()

sess.Flush();
currentTransaction.Commit();

यदि आप अपने परिवर्तन नहीं करने का निर्णय लेते हैं:

tx.Rollback();  // rollback the transaction

या:

currentTransaction.Rollback();

यदि आप लेन-देन रोलबैक करते हैं, तो आपको तुरंत चालू सत्र को बंद करना चाहिए और यह सुनिश्चित करना चाहिए कि NHibernate की आंतरिक स्थिति सुसंगत है।

ISession को बंद करना

एक ISession.Close()सत्र के अंत को चिह्नित करने के लिए एक कॉल । क्लोज़ () का मुख्य निहितार्थ यह है कि ADO.NET कनेक्शन सत्र द्वारा त्याग दिया जाएगा।

tx.Commit();
sess.Close();

sess.Flush();
currentTransaction.Commit();
sess.Close();

यदि आपने अपना कनेक्शन प्रदान Close()किया है, तो इसका संदर्भ देता है, इसलिए आप इसे मैन्युअल रूप से बंद कर सकते हैं या इसे पूल में वापस कर सकते हैं। अन्यथा Close()इसे पूल में लौटा देता है।


2
मेरे लिए, यह पंक्ति मुख्य थी: "क्लोज़ () का मुख्य निहितार्थ यह है कि ADO.NET कनेक्शन सत्र द्वारा त्याग दिया जाएगा।" यदि आप ISession.Close () को कॉल नहीं करते हैं, तो आपके कनेक्शन तब तक भरे जाते हैं जब तक आप डीबी टाइमआउट प्राप्त नहीं कर लेते। : o
थिएबेन

हम आम तौर पर: खुले सत्र सत्र.बिजिनट्रांसलेशन () काम ... सेशन। ट्रांसएक्शन.कॉमिट () सेशन .BeginTransaction () वर्क ... सेशन। ट्रांसएक्शन.कोमाइट () सेशन .BeginTransaction () वर्क .. session.Transaction.Commit () निपटान सत्र।
चंचल जेडी

शानदार राइट-अप और +1 और आदि - हालांकि मुझे लगता है कि एक संपादन की आवश्यकता हो सकती है क्योंकि आप शीर्ष पर कहते हैं "कभी भी बंद उपयोग न करें" और फिर बाद में "यदि आप लेन-देन को तुरंत रोलबैक करते हैं तो आपको वर्तमान सत्र को बंद कर देना चाहिए"
SpaceBison

क्या एसक्यूएल स्टेटमेंट का क्रम बदला जा सकता है। मेरा मतलब है कि मुझे एक इकाई ऑब्जेक्ट पर अपडेट डालने और सम्मिलित करने की आवश्यकता है क्योंकि मेरे पास संगत तालिका में एक बाधा है।
bob_saginowski

14

NHibernate 2.0 में शुरू, लेनदेन डीबी संचालन के लिए आवश्यक हैं। इसलिए, ITransaction.Commit()कॉल किसी भी आवश्यक निस्तब्धता को संभाल लेगा। यदि किसी कारण से आप NHibernate लेनदेन का उपयोग नहीं कर रहे हैं, तो सत्र का कोई ऑटो-फ्लशिंग नहीं होगा।


1

समय-समय पर ISession ADO.NET कनेक्शन की स्थिति को मेमोरी में रखी गई वस्तुओं की स्थिति के साथ सिंक्रनाइज़ करने के लिए आवश्यक SQL कथनों को निष्पादित करेगा।

और हमेशा उपयोग करें

 using (var transaction = session.BeginTransaction())
 {
     transaction.Commit();
 }

परिवर्तनों के बाद डेटाबेस में सहेजने के लिए किए गए परिवर्तनों से हम लेन-देन का उपयोग करते हैं। मोहित ();


0

यहां मेरे कोड के दो उदाहरण दिए गए हैं, जहां यह सत्र के बिना विफल हो जाएगा। फ़्लश ():

http://www.lucidcoding.blogspot.co.uk/2012/05/changing-type-of-entity-persistence.html

इसके अंत में, आप कोड का एक भाग देख सकते हैं, जहाँ पर मैं पहचान सम्मिलित करता हूँ, निकाय को तब फ्लश में सहेजता हूँ, फिर पहचान सम्मिलित सेट को बंद करता हूँ। इस फ्लश के बिना यह इकाई को बचाने के लिए और फिर पहचान की स्थापना को चालू करने के लिए लग रहा था।

फ्लश () के उपयोग ने मुझे अधिक नियंत्रण दिया जो चल रहा था।

यहाँ एक और उदाहरण है:

TransactionScope के अंदर NServiceBus संदेश भेजना

मुझे पूरी तरह से समझ में नहीं आया कि इस पर क्यों, लेकिन फ्लश () ने मेरी त्रुटि को होने से रोक दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.