जेपीए / हाइबरनेट में फ्लश () का सही उपयोग


110

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

अब मुझे दो संस्थाओं Aऔर B(एक-से-एक रिश्ते में, लेकिन जेपीए द्वारा लागू या लागू नहीं) के साथ निम्नलिखित परिदृश्य मिला । Aएक समग्र पीके है, जो मैन्युअल रूप से सेट किया गया है, और इसमें एक ऑटो-जनरेट किया गया पहचान क्षेत्र भी है recordId। इसे एक विदेशी-कुंजी के रूप में recordIdइकाई के लिए लिखा जाना चाहिए । मैं बचत कर रहा हूं और एक ही लेनदेन में। समस्या यह है कि लेन-देन के भीतर ऑटो-जनरेटेड वैल्यू उपलब्ध नहीं है, जब तक कि मैं कॉल करने के बाद स्पष्ट कॉल नहीं करता । (यदि मेरे पास स्वतः-जनरेट की पहचान पीके है तो मान सीधे इकाई में अद्यतन किया जाता है, लेकिन यहाँ ऐसा नहीं है।)BAABA.recordIdem.flush()em.persist()A

कर सकते हैं em.flush()जब यह एक लेन-देन के भीतर उपयोग कर किसी भी नुकसान का कारण?

जवाबों:


148

संभवतः em.flush()कार्यान्वयन-निर्भर होने के सटीक विवरण हैं। वैसे भी, हाइबरनेट जैसे जेपीए प्रदाता SQL निर्देशों को डेटाबेस में भेजने के लिए कैश कर सकते हैं, अक्सर जब तक आप वास्तव में लेनदेन नहीं करते हैं। उदाहरण के लिए, आप कहते हैं em.persist(), हाइबरनेट यह याद रखता है कि उसे एक डेटाबेस INSERT बनाना है, लेकिन वास्तव में अनुदेश का निष्पादन नहीं करता है जब तक आप लेनदेन नहीं करते हैं। Afaik, यह मुख्य रूप से प्रदर्शन कारणों से किया जाता है।

कुछ मामलों में वैसे भी आप चाहते हैं कि SQL निर्देश तुरंत निष्पादित हो; आम तौर पर जब आपको कुछ साइड इफेक्ट्स के परिणाम की आवश्यकता होती है, जैसे ऑटोजेनरेटेड कुंजी या डेटाबेस ट्रिगर।

em.flush()आंतरिक SQL निर्देश कैश को खाली करने के लिए क्या है, और इसे तुरंत डेटाबेस में निष्पादित करें।

निचला रेखा: कोई नुकसान नहीं हुआ है, केवल आप (मामूली) प्रदर्शन हिट कर सकते हैं क्योंकि आप JPA प्रदाता के फैसले को ओवरराइड कर रहे हैं क्योंकि डेटाबेस को SQL निर्देश भेजने के लिए सबसे अच्छा समय का संबंध है।


1
उसने क्या क़हा। em.flush () व्यवहार echoes java.io.Flushable.flush () जहां सभी बफ़र किए गए डेटा जो भी गंतव्य के लिए उपयुक्त हैं भेजे जाते हैं।
एरिक

4
अगर फ्लश () डेटाबेस में डेटा भेजता है? क्या होता है अगर एक अपवाद उसके बाद फेंक दिया जाता है? क्या इकाई प्रबंधक सब कुछ रोलबैक करेगा? यहां तक ​​कि पहले फ्लश में लिखे गए डेटा?
जेम हैबटलजेल

101
फ्लश () INSERT, UPDATE आदि डेटाबेस में SQL निर्देश भेजता है। यह एक COMMIT नहीं भेजेगा, इसलिए यदि आपके पास फ्लश () के बाद कोई अपवाद है, तो भी आपके पास पूर्ण रोलबैक हो सकता है।
फ्लावियो

17
आप DB को रोलबैक कर सकते हैं, लेकिन यह ऑब्जेक्ट में किसी भी बदलाव को रोलबैक नहीं करेगा, उदाहरण के लिए, ऑटो-इंक्रीमेंट किए गए 'वर्जन', ऑटोजेनरेटेड आईडी आदि। इसके अलावा रोलबैक के बाद यूनिट मैनेजर बंद हो जाएगा। बस इस बात से सावधान रहें कि यदि आप किसी अन्य सत्र में ऑब्जेक्ट को 'मर्ज' करने का प्रयास करते हैं, तो विशेष रूप से स्वतः-संवर्धित 'संस्करण' एक ऑप्टिमिस्टिकलोक अपवाद हो सकता है।
पीटर डेविस

11
साइड इफेक्ट को ट्रिगर करने के अलावा, फ्लश () का उपयोग करने का एक अन्य कारण यह है कि क्या आप जेपीक्यूएल / एचक्यूएल (एक परीक्षण में उदाहरण) का उपयोग करके डेटाबेस में एक ऑपरेशन के प्रभावों को पढ़ने में सक्षम होना चाहते हैं। इन प्रश्नों को निष्पादित करते समय JPA कैश्ड डेटा का उपयोग नहीं कर सकता है, इसलिए केवल वह सामान जो वास्तव में DB में पढ़ा जाएगा।
सेलेक

2

दरअसल, em.flush()कैश्ड एसक्यूएल कमांड को भेजने से ज्यादा करते हैं। यह अंतर्निहित डेटाबेस के लिए दृढ़ता संदर्भ को सिंक्रनाइज़ करने का प्रयास करता है। यदि आपकी कैश में सिंक्रनाइज़ होने के लिए संग्रह हैं, तो यह आपकी प्रक्रियाओं पर बहुत समय लेने का कारण बन सकता है।

इसका उपयोग करने पर सावधानी।


1

क्या किसी लेन-देन के भीतर इसका इस्तेमाल करने पर em.flush () को कोई नुकसान हो सकता है?

हां, यह आवश्यक से अधिक लंबी अवधि के लिए डेटाबेस में ताले लगा सकता है।

आम तौर पर, जेपीए का उपयोग करते समय आप लेन-देन प्रबंधन को कंटेनर (उर्फ सीएमटी - व्यापार विधियों पर @ ट्रान्सएक्टेंशियल एनोटेशन का उपयोग करते हुए) का प्रतिनिधित्व करते हैं, जिसका अर्थ है कि विधि में प्रवेश करते समय और अंत में शुरू / लुढ़का हुआ होने पर लेनदेन स्वचालित रूप से शुरू होता है। यदि आप EntityManager को डेटाबेस सिंक्रोनाइज़ेशन को हैंडल करने देते हैं, तो sql स्टेटमेंट एक्जीक्यूशन को कमिट करने से ठीक पहले ट्रिगर किया जाएगा, जिसके कारण डेटाबेस में कम समय तक ताले रह सकते हैं। अन्यथा आपके मैन्युअल रूप से फ्लश किए गए लेखन संचालन मैन्युअल फ्लश और स्वचालित प्रतिबद्ध के बीच ताले को बनाए रख सकते हैं जो शेष विधि निष्पादन समय के अनुसार लंबा हो सकता है।

नोट जो कुछ ऑपरेशन स्वचालित रूप से एक फ्लश चलाता है: एक ही सत्र के खिलाफ एक देशी क्वेरी को निष्पादित करना (EM राज्य को SQL क्वेरी द्वारा पहुंच योग्य होना चाहिए), देशी उत्पन्न आईडी (डेटाबेस द्वारा उत्पन्न) का उपयोग करके संस्थाओं को सम्मिलित करना, इसलिए सम्मिलित विवरण होना चाहिए इस प्रकार ट्रिगर की गई EM उत्पन्न आईडी को पुनः प्राप्त करने और रिश्तों को ठीक से प्रबंधित करने में सक्षम है)

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