हाइबरनेट संपत्ति hibernate.jdbc.batch_size
हाइबरनेट के लिए आपके इंसर्ट या अपडेट स्टेटमेंट को ऑप्टिमाइज़ करने का एक तरीका है जबकि फ्लशिंग लूप मेमोरी थकावट के बारे में है।
बैचसाइज के बिना जब आप किसी इकाई को हाइबरनेट फायर 1 इंसर्ट स्टेटमेंट को सेव करने का प्रयास करते हैं, इस प्रकार यदि आप एक बड़े संग्रह के साथ काम करते हैं, तो प्रत्येक हाइबरनेट फायर 1 स्टेटमेंट को सेव करें
कोड के निम्नलिखित भाग की कल्पना करें:
for(Entity e : entities){
session.save(e);
}
यहां हाइबरनेट आपके संग्रह में प्रति इकाई 1 सम्मिलित विवरण सक्रिय करेगा। यदि आपके संग्रह में 100 तत्व हैं तो 100 सम्मिलित विवरण आग होंगे। यह दृष्टिकोण 2 मुख्य कारणों से बहुत कुशल नहीं है:
- 1) आप अपने पहले स्तर के कैश को तेजी से बढ़ाते हैं और संभवत:जल्द ही एक
OutOfMemoryException
के साथ समाप्त कर देंगे। । - 2) आप प्रत्येक स्टेटमेंट के लिए नेटवर्क राउंड ट्रिप के कारण प्रदर्शन को कम करते हैं।
hibernate.jdbc.batch_size और फ्लशिंग लूप के 2 अलग-अलग उद्देश्य हैं लेकिन पूरक हैं।
बैच में कितनी इकाइयां होंगी, यह नियंत्रित करने के लिए हाइबरनेट पहले का उपयोग करता है। कवर के तहत हाइबरनेट java.sql.Statement.addBatch(...)
. का उपयोग करें और executeBatch()
तरीके।
तो hibernate.jdbc.batch_size हाइबरनेट को बताता है कि उसे कितनी बार addBatch()
पर कॉल करना है कॉल करने से पहले executeBatch()
।
इसलिए इस गुण को सेट करने से आपकी याददाश्त समाप्त नहीं होती है।
स्मृति की देखभाल करने के लिए आपको नियमित रूप से अपना सत्र फ्लश करना होगा और यही फ्लशिंग लूप का उद्देश्य है।
जब आप लिखते हैं :
for(Entity e : entities){
if (i % 100 == 0 && i>0) {
session.flush();
session.clear();
}
}
आप हाइबरनेट को कह रहे हैं कि प्रत्येक 100 इकाइयों में सत्र को फ्लश और साफ़ करें (आप स्मृति जारी करते हैं)।
तो अब दोनों के बीच की कड़ी क्या है?
इष्टतम होने के लिए आपको अपना jdbc.batch_size
. परिभाषित करना होगा और आपका फ्लशिंग परम समान।
यदि आप एक फ्लश परम को कम परिभाषित करते हैं कि आपके द्वारा चुना गया बैच_साइज़ हाइबरनेट सत्र को अधिक बार फ्लश करेगा, इसलिए यह तब तक छोटा बैच बनाएगा जब तक कि यह btach आकार तक नहीं पहुंच जाता है जो कुशल नहीं है
जब 2 एक ही हाइबरनेट होते हैं, तो केवल अंतिम आकार को छोड़कर इष्टतम आकार के बैचों को निष्पादित करेगा यदि संग्रह का आकार आपके बैच_साइज का एक से अधिक नहीं है।
आप निम्न पोस्ट इस अंतिम बिंदु के बारे में अधिक जानकारी के लिए