हाइबरनेट में सत्र.फ्लश () का उपयोग क्या है


110

जब हम एक रिकॉर्ड अपडेट कर रहे हैं, हम session.flush()हाइबरनेट के साथ उपयोग कर सकते हैं । इसकी क्या जरूरत है flush()?

जवाबों:


138

सत्र को निस्तब्धता हाइबरनेट को Sessionडेटाबेस की इन-मेमोरी स्थिति (यानी डेटाबेस में परिवर्तन लिखने के लिए) को सिंक्रनाइज़ करने के लिए मजबूर करता है। डिफ़ॉल्ट रूप से, हाइबरनेट आपके लिए परिवर्तनों को स्वचालित रूप से प्रवाहित करेगा:

  • कुछ क्वेरी निष्पादित करने से पहले
  • जब कोई लेनदेन किया जाता है

स्पष्ट रूप से फ्लश करने की अनुमति देने से Sessionमहीन नियंत्रण मिलता है जो कुछ परिस्थितियों में आवश्यक हो सकता है (एक आईडी प्राप्त करने के लिए, सत्र के आकार को नियंत्रित करने के लिए ...)।


8
ध्यान दें कि यह उत्तर DEFAULT हाइबरनेट व्यवहार का वर्णन करता है: फ्लश व्यवहार को फ्लश मोड सेटिंग के माध्यम से बदला जा सकता है। विवरण docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/… (संस्करण 3.5) में हैं।
स्टीव टीटी

1
मुझे दस्तावेज़ मिला जहां यह कहा गया है कि आप वास्तव में क्या कह रहे हैं, लेकिन मेरा प्रश्न है कि प्राथमिकता 1 का अर्थ क्या होगा) मेरे पास वर्ग है जहां मैं कोड का उपयोग करके ऑब्जेक्ट को सहेज रहा हूं id = session.save(obj);और लेनदेन बहुत अगली पंक्ति में प्रतिबद्ध है, लेकिन obj सहेजा नहीं जा रहा है DB के लिए, क्यों? 2) मैंने session.save(obj);कमिट का उपयोग करते हुए return obj.getprimaryID();obj को सेव किया और वापस आते समय मैंने उपयोग किया इस मामले में obj को DB में सहेजा गया है। तो यह व्यवहार क्यों हो रहा है?
अमोघ

74

जैसा कि ऊपर दिए गए उत्तरों में सही कहा गया है, flush()हम कॉल करके हाइबरनेट को डेटाबेस पर SQL कमांड को निष्पादित करने के लिए मजबूर करते हैं। लेकिन समझते हैं कि परिवर्तन अभी "प्रतिबद्ध" नहीं हैं। इसलिए फ्लश करने के बाद और कमिट करने से पहले, यदि आप सीधे DB (SQL प्रॉम्प्ट से कहते हैं) तक पहुँचते हैं और संशोधित पंक्तियों की जाँच करते हैं, तो आपको बदलाव नहीं दिखेंगे।

यह 2 SQL कमांड सत्र खोलने के समान है। और 1 सत्र में किए गए परिवर्तन दूसरों के लिए प्रतिबद्ध नहीं हैं।


12
अच्छी तरह से - परिवर्तन थोड़ा दिखाई दे सकते हैं। उदाहरण के लिए, एक uncommitted पंक्ति सम्मिलित लेकिन अप्रभावित पंक्ति पर एक लॉक बना सकती है और उसी पंक्ति को किसी अन्य सत्र द्वारा डाले जाने तक विलंबित कर सकती है जब तक कि लेनदेन प्रतिबद्ध या लुढ़का-वापस नहीं हो जाता। इसलिए यह पूरी तरह से अदृश्य नहीं है।
रगोम

2
मैं पूरे वेब पर सर्फ कर चुका हूं और यही वह जवाब है जो आखिरकार मुझे मिला है। धन्यवाद।
सिद्धार्थ

लूप में .flush () लगाने का क्या उपयोग है, अगर अंत में फ्लश होता है?
इलदोसा

@ कौशिक लेले व्हाट्स ऑफ द फ्लश () अगर फ्लश के बाद डेटा दिखाई नहीं दे रहा है? क्या आप कुछ बारीक उपयोग के मामलों के बारे में विस्तार से बता सकते हैं जहाँ यह काम आता है?
java_geek

28

मैं केवल यह जानता हूं कि जब हम session.flush()अपने बयानों को डेटाबेस में निष्पादित करते हैं, लेकिन प्रतिबद्ध नहीं होते हैं।

मान लीजिए कि हम flush()सत्र वस्तु पर विधि नहीं कहते हैं और अगर हम प्रतिबद्ध विधि कहते हैं, तो यह आंतरिक रूप से डेटाबेस पर कथनों को निष्पादित करने और फिर कमिट करने का काम करेगा।

commit=flush+commit (कार्यक्षमता के मामले में)

इस प्रकार, मैं यह निष्कर्ष निकालता हूं कि जब हम सत्र ऑब्जेक्ट पर विधि फ्लश () कहते हैं, तो यह प्रतिबद्ध नहीं होता है, लेकिन डेटाबेस को हिट करता है और क्वेरी को निष्पादित करता है और रोलबैक भी प्राप्त करता है।

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


क्या आप फ्लश की आवश्यकता के बारे में कुछ विवरण दे सकते हैं?
java_geek

14

सत्र को फ्लशिंग करने से वह डेटा मिलता है जो वर्तमान में डेटाबेस में मौजूद सत्र के साथ सिंक्रनाइज़ है।

हाइबरनेट वेबसाइट पर अधिक:

flush()उपयोगी है, क्योंकि सत्र JDBC कॉल को निष्पादित करने के बारे में कोई गारंटी नहीं है, केवल उस क्रम में जिसमें वे निष्पादित किए जाते हैं - सिवाय आपके उपयोग के flush()


क्या आप एक परिदृश्य प्रदान कर सकते हैं जब उपयोगकर्ता को अनुक्रम के बारे में चिंता करनी चाहिए? डीबी से संबंधित चीजों को उपयोगकर्ता के लिए पारदर्शी बनाने के लिए हाइबरनेट का उपयोग करना है। जब हम "कमिट" करते हैं, तो फ्लशिंग स्वचालित रूप से होता है। ऐसा कौन सा परिदृश्य है जहाँ आप फ्लश करेंगे लेकिन प्रतिबद्ध नहीं होंगे?
कौशिक लेले

1
@ कौशिकेल आप इस प्रश्न का उल्लेख कर सकते हैं stackoverflow.com/questions/37382872/…
GMsoF

10

आप flushलेन-देन के प्रतिबद्ध होने के बजाय एक ज्ञात स्थान पर मान्यता बाधाओं का पता लगाने और उनका उपयोग करने के लिए बाध्य करने के लिए उपयोग कर सकते हैं । यह हो सकता है कि commitघोषणात्मक तर्क, कंटेनर या एक टेम्पलेट के माध्यम से कुछ रूपरेखा तर्क द्वारा निहित हो। इस मामले में, फेंके गए किसी भी अपवाद को पकड़ना और संभालना मुश्किल हो सकता है (यह कोड में बहुत अधिक हो सकता है)।

उदाहरण के लिए, यदि आपके पास save()एक नया EmailAddress ऑब्जेक्ट है, जिसमें पते पर एक अद्वितीय बाधा है, तो आपको तब तक कोई त्रुटि नहीं मिलेगी जब तक आप प्रतिबद्ध नहीं होते।

कॉलिंग flush()पंक्ति को सम्मिलित करने के लिए बाध्य करता है, यदि कोई डुप्लिकेट है, तो अपवाद को फेंकना।

हालांकि, आपको अपवाद के बाद सत्र को वापस रोल करना होगा।


4

मैं बस ऊपर दिए गए सभी उत्तरों को क्लब करना चाहूंगा और सत्रांक.सेवे () के साथ फ्लश () विधि को भी अधिक महत्व देना चाहूंगा।

डेटाबेस को इकाई को बचाने के लिए हाइबरनेट सेव () का उपयोग किया जा सकता है। हम इस पद्धति को लेनदेन से बाहर कर सकते हैं, इसीलिए मुझे डेटा सहेजने की यह विधि पसंद नहीं है। यदि हम बिना लेन-देन के इसका उपयोग करते हैं और हमारे पास संस्थाओं के बीच कास्केडिंग है, तो केवल प्राथमिक संस्था बच जाती है, जब तक कि हम सत्र को फ्लश नहीं करते।

फ्लश (): सत्र को फ्लश करने के लिए मजबूर करता है। इसका उपयोग डेटाबेस के साथ सत्र डेटा को सिंक्रनाइज़ करने के लिए किया जाता है।

जब आप session.flush () कॉल करते हैं, तो स्टेटमेंट्स डेटाबेस में निष्पादित होते हैं लेकिन यह प्रतिबद्ध नहीं होगा। यदि आप session.flush () को कॉल नहीं करते हैं और यदि आप session.commit () को कॉल करते हैं, तो आंतरिक रूप से प्रतिबद्ध () विधि स्टेटमेंट को निष्पादित करती है और शुरू होती है।

तो कमिट () = फ्लश + कमिट। इसलिए session.flush () केवल डेटाबेस में स्टेटमेंट्स को निष्पादित करता है (लेकिन कमिट नहीं होता है) और स्टेटमेंट अब मेमरी में नहीं हैं। यह सिर्फ सत्र को फ्लश करने के लिए मजबूर करता है।

कुछ महत्वपूर्ण बिंदु:

हमें बाहरी लेन-देन की सीमा को बचाने से बचना चाहिए, अन्यथा मैप की गई संस्थाओं को डेटा असंगति के कारण बचाया नहीं जाएगा। सत्र को फ्लश करना भूल जाना बहुत सामान्य है क्योंकि यह कोई अपवाद या चेतावनी नहीं देता है। डिफ़ॉल्ट रूप से, हाइबरनेट आपके लिए स्वचालित रूप से परिवर्तनों को फ्लश करेगा: कुछ क्वेरी निष्पादित होने से पहले जब कोई लेनदेन किया जाता है, तो सत्र को स्पष्ट रूप से फ्लश करने की अनुमति देने से कुछ परिस्थितियों में (एक आईडी प्राप्त करने के लिए, सत्र का आकार नियंत्रित करने के लिए आवश्यक हो सकता है) )


3

flush() विधि सत्र फ्लश करने के लिए हाइबरनेट कारण बनता है। आप setFlushMode()विधि का उपयोग करके सत्र के लिए फ्लशिंग मोड का उपयोग करने के लिए हाइबरनेट को कॉन्फ़िगर कर सकते हैं । वर्तमान सत्र के लिए फ्लश मोड प्राप्त करने के लिए, आप getFlushMode()विधि का उपयोग कर सकते हैं । यह देखने के लिए कि क्या सत्र गंदा है, आप उपयोग कर सकते हैंisDirty() विधि का । डिफ़ॉल्ट रूप से, हाइबरनेट सत्रों के फ्लशिंग का प्रबंधन करता है।

जैसा कि प्रलेखन में कहा गया है:

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/flushing/Flushing.html

फ्लशिंग

निस्तब्धता अंतर्निहित डेटाबेस के साथ दृढ़ता संदर्भ की स्थिति को सिंक्रनाइज़ करने की प्रक्रिया है। EntityManagerऔर हाइबरनेटSession तरीकों का एक सेट, जिसके माध्यम से आवेदन डेवलपर एक इकाई की लगातार राज्य को बदल सकते हैं बेनकाब।

दृढ़ता संदर्भ किसी भी इकाई स्थिति परिवर्तन को कतारबद्ध करते हुए, ट्रांसेक्शनल लिखने के पीछे कैश के रूप में कार्य करता है। किसी भी लिखने के पीछे कैश की तरह, परिवर्तन पहली बार मेमोरी में लागू होते हैं और फ्लश समय के दौरान डेटाबेस के साथ सिंक्रनाइज़ होते हैं। फ्लश ऑपरेशन हर इकाई को बदलता है और इसे ए INSERT, UPDATEया में अनुवाद करता हैDELETE कथन में ।

फ्लशिंग रणनीति वर्तमान चल रहे हाइबरनेट सत्र के फ्लशमोड द्वारा दी गई है । हालांकि जेपीए केवल दो फ्लशिंग रणनीतियों ( AUTOऔर COMMIT) को परिभाषित करता है , हाइबरनेट में फ्लश प्रकारों का अधिक व्यापक स्पेक्ट्रम है:

  • ALWAYS: हर प्रश्न से पहले सत्र फ्लश;
  • AUTO: यह डिफ़ॉल्ट मोड है और यदि आवश्यक हो तो ही सत्र निकाल देता है;
  • COMMIT: सेशन फ्लश में देरी करने की कोशिश करता है जब तक कि करंट ट्रांजैक्शन नहीं हो जाता है, हालांकि यह समय से पहले भी फ्लश हो सकता है;
  • MANUAL: सत्र निस्तब्धता आवेदन के लिए प्रत्यायोजित है, जिसे Session.flush()दृढ़ता संदर्भ परिवर्तनों को लागू करने के लिए स्पष्ट रूप से कॉल करना चाहिए ।

डिफ़ॉल्ट रूप से, हाइबरनेट AUTOफ्लश मोड का उपयोग करता है जो निम्नलिखित परिस्थितियों में फ्लश चलाता है:

  • लेनदेन करने से पहले;
  • एक JPQL / HQL क्वेरी को निष्पादित करने से पहले जो कतारबद्ध निकाय क्रियाओं के साथ ओवरलैप होता है;
  • किसी भी मूल SQL क्वेरी को निष्पादित करने से पहले जिसका कोई पंजीकृत सिंक्रनाइज़ेशन नहीं है।

1

कॉलिंग EntityManager#flushहै दुष्प्रभाव । यह आसानी से उत्पन्न आईडी मान (अनुक्रम मान) के साथ इकाई प्रकारों के लिए उपयोग किया जाता है: ऐसी आईडी अंतर्निहित दृढ़ता परत के साथ सिंक्रनाइज़ेशन पर ही उपलब्ध है। यदि वर्तमान लेनदेन समाप्त होने से पहले (उदाहरण के लिए लॉगिंग उद्देश्यों के लिए) यह आईडी आवश्यक है, तो सत्र को फ्लश करना आवश्यक है।


0

इस विधि से आप फ्लश प्रक्रिया को बढ़ाते हैं। यह प्रक्रिया आपके डेटाबेस की स्थिति को आपके सत्र की स्थिति के साथ राज्य परिवर्तनों का पता लगाने और संबंधित SQL स्टेटमेंट्स को निष्पादित करके सिंक्रनाइज़ करती है।

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