आम तौर पर सस्ती आकार और order_insert
को batch size
की स्थापना, order_updates
true
में महत्वपूर्ण प्रदर्शन में सुधार कर सकते हैं।
मेरी सभी परियोजनाओं मैं आधार के रूप में इस विन्यास का उपयोग में:
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 का उपयोग करता है लगता है।
आपके उत्तर के लिए धन्यवाद। लेकिन दुर्भाग्य से मुझे 'order_insert' और' order_update' का उपयोग नहीं मिला। –
@AmirPashazadeh टिप्पणी के लिए धन्यवाद। मैंने 'action_ueue' संग्रह को सॉर्ट करने के लिए' order_inserts' का उपयोग कैसे किया जाता है, इस पर कुछ उदाहरण जोड़ा। वही 'order_updates' के लिए जाता है। –