2015-01-03 6 views
6

क्या कोई कारण हैं कि हाइबरनेट बैचिंग/hibernate.order_updates/hibernate.order_inserts डिफ़ॉल्ट रूप से अक्षम हैं? क्या आप 50 के बैच आकार को सक्षम करते समय कोई नुकसान होता है? Order_updates/order_inserts पैरामीटर के लिए वही। क्या कोई उपयोग केस है जहां आपको यह सुविधाएं सक्षम नहीं करनी चाहिए? क्या इस सुविधा का उपयोग करते समय कोई प्रदर्शन प्रभाव पड़ता है?डिफ़ॉल्ट रूप से हाइबरनेट बैचिंग/order_inserts/order_updates अक्षम क्यों हैं?

मैं केवल यह देख सकता हूं कि इन सेटिंग्स को बहुत मदद मिलती है जब मुझे अपनी क्वेरी गिनती को कम करने की आवश्यकता होती है जो विशेष रूप से क्लाउड वातावरण में आवश्यक है जिसमें मेरे एप्लिकेशन और डेटाबेस सर्वर के बीच उच्च विलंबता है।

उत्तर

14

आम तौर पर सस्ती आकार और order_insert को batch size की स्थापना, order_updatestrue में महत्वपूर्ण प्रदर्शन में सुधार कर सकते हैं।

मेरी सभी परियोजनाओं मैं आधार के रूप में इस विन्यास का उपयोग में:

hibernate.jdbc.batch_size = 100 
hibernate.order_inserts = true 
hibernate.order_updates = true 
hibernate.jdbc.fetch_size = 400 

लेकिन, हाँ - वहाँ स्मृति प्रभाव जब बैचिंग का उपयोग कर किया जा सकता है। लेकिन यह jdbc ड्राइवर पर निर्भर करता है।

उदाहरण के लिए ओरेकल जेडीबीसी ड्राइवर प्रत्येक PreparedStatement के लिए आंतरिक बफर बनाता है और इन बफर का पुन: उपयोग करता है। यदि आप सरल अपडेट स्टेटमेंट कहते हैं तो आप ps.setInt(1, ...), ps.setString(2, ...) आदि के साथ कुछ पैरामीटर सेट करते हैं, और ओरेकल इस मान को PreparedStatement और कनेक्शन से जुड़े बफर में कुछ बाइट प्रतिनिधित्व और स्टोर में परिवर्तित करता है।

हालांकि जब आपका PreparedStatement आकार 100 के बैच का उपयोग करता है, तो यह बफर 100 गुना बड़ा होगा। और यदि आपके पास 50 कनेक्शन के लिए कुछ कनेक्शन पूल है तो 50 ऐसे बड़े बफर हो सकते हैं। और यदि आपके पास ऐसे सभी बफर बैचिंग का उपयोग करके 100 अलग-अलग बयान हैं, तो महत्वपूर्ण मेमोरी प्रभाव हो सकता है। जब आप बैच आकार सक्षम करते हैं तो यह वैश्विक सेटिंग बन जाता है - हाइबरनेट सभी डालने/अपडेट के लिए इसका उपयोग करेगा।

हालांकि मुझे पता चला कि मेरी सभी परियोजनाओं में प्रदर्शन लाभ अधिक महत्वपूर्ण था कि यह स्मृति प्रभाव पड़ता है और इसलिए मैं अपने डिफ़ॉल्ट के रूप में batchsize=100 का उपयोग करता हूं।

order_inserts, order_updates के साथ, मुझे लगता है कि इन डिफ़ॉल्ट रूप से अक्षम हैं, क्योंकि इन सेटिंग्स मतलब केवल जब बैचिंग पर है। बैचिंग सेट के साथ, ये ऑर्डरिंग ओवरहेड है।

आप Oracle के श्वेत पत्र में अधिक जानकारी पा सकते हैं:

http://www.oracle.com/technetwork/topics/memory.pdf

में खंड "वक्तव्य बैचिंग और मेमोरी उपयोग"

==== संपादित 2016/05/31 ====

एक शब्द के बारे में order_inserts और order_udpates संपत्ति।

session.save(A1); // added to action queue 
session.save(B1); // added to action queue 
session.save(A2); // ... 
session.save(B2); // ... 
session.save(A3); // ... 
session.save(B3); // ... 

ऊपर निष्पादन के बाद:

  • इन 6 वस्तुओं पहचानकर्ता उत्पन्न किया है
  • इन 6 वस्तुओं सत्र से जुड़े हैं ( कहते हैं कि हम संस्थाओं A, B है और 6 वस्तुओं इस तरह से जारी रहती है की सुविधा देता है स्टेटफुलपर्सिस्टेंस कॉन्टेक्स्ट: एंटीटीजकी, एंट्री एंटर्री, इत्यादि/एचआईबी.वी 3/)
  • इन 6 ऑब्जेक्ट्स को उसी क्रम में एक्शनक्यूयू में जोड़ा जाता है: [ए 1, बी 1, ए 2, बी 2, ए 3, बी 3]

अब, पर विचार 2 मामलों:

मामले 1:order_inserts = false

फ्लश चरण हाइबरनेट दौरान

करता 6 डालने बयान:

ActionQueue = [A1, B1, A2, B2, A3, B3] 
insert into A - (A1) 
insert into B - (B1) 
insert into A - (A2) 
insert into B - (B2) 
insert into A - (A3) 
insert into B - (B3) 

मामले 2:order_inserts = true , बैचिंग

की अनुमति है

अब, के दौरान फ्लश चरण हाइबरनेट 2 बैच बयान सम्मिलित करता है:

ActionQueue = [A1, A2, A3, B1, B2, B3] 
insert into A - (A1, A2, A3) 
insert into B - (B1, B2, B3) 

मैं हाइबरनेट v3 के लिए इस की जांच की, मैं हाइबरनेट v4 उसी तरह से ActionQueue का उपयोग करता है लगता है।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन दुर्भाग्य से मुझे 'order_insert' और' order_update' का उपयोग नहीं मिला। –

+1

@AmirPashazadeh टिप्पणी के लिए धन्यवाद। मैंने 'action_ueue' संग्रह को सॉर्ट करने के लिए' order_inserts' का उपयोग कैसे किया जाता है, इस पर कुछ उदाहरण जोड़ा। वही 'order_updates' के लिए जाता है। –

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