2009-08-25 15 views
13

मेरे पास एक हाइबरनेट डोमेन ऑब्जेक्ट है जो एप्लिकेशन के विभिन्न हिस्सों से लोड हो जाता है। कभी-कभी यह हर एसोसिएशन और दूसरों को आलसी लोड करने के लिए फायदेमंद है, यह पूरी बात को एक साथ शामिल करने के लिए बेहतर है। एक उम्मीद है कि खुशहाल वादा मैंने पाया के रूप में:हाइबरनेट: बैच_साइज? द्वितीय स्तर कैश?

बैच प्राप्त कर रहा है का उपयोग करना, हाइबरनेट कई अप्रारंभीकृत प्रॉक्सी लोड कर सकते हैं अगर एक प्रॉक्सी पहुँचा जा सकता है। बैच फ़ेचिंग आलसी चुनने वाली रणनीति का अनुकूलन है।

hibernate.default_batch_fetch_size:

बैच प्राप्त कर रहा है का उपयोग करना, हाइबरनेट कई अप्रारंभीकृत प्रॉक्सी अगर एक प्रॉक्सी पहुँचा जा सकता है लोड कर सकते हैं। बैच फ़ेचिंग आलसी चयन लाने की रणनीति का अनुकूलन है।

मैं यह भी देखें:

hibernate.jdbc.fetch_size:

एक गैर शून्य मान निर्धारित करता है JDBC आकार लाने (कॉल Statement.setFetchSize())।

अच्छी तरह से बैच लाने के दौरान दूसरे स्तर के कैश में देखने के लिए पर्याप्त स्मार्ट हाइबरनेट है? i.e क्या एसोसिएशन को प्रारंभिक कॉल के लिए एक लाने के लिए और फिर अगले एक्स कॉल कैश हिट करते हैं? इस तरह से मैं आलसी लोडिंग चाहता हूं, लेकिन अधिकतर थोक-जैसे लेन-देन के लिए अक्सर कैश को भी दबा सकता हूं।

संग्रह की सारी सामग्री को पहले से ही कैश में निहित है, तो यह अभी भी प्राप्त कर रहा है प्रश्नों संग्रह का उपयोग पर अमल करेंगे?

धन्यवाद।

+0

अब यह कुछ है जो मैं भी जवाब जानना चाहता हूं। – Zoidberg

+1

मेरा प्रश्न मार्क करें :-) – davidemm

उत्तर

6

मैं आज अनुसंधान के एक बहुत कुछ किया है और अपने खुद के सवाल के जवाब में की खुदाई कर रहा था। मैं हाइबरनेट कोड के माध्यम से देख रहा था और प्रवाह इस तरह दिखता है:

संग्रह प्रारंभ कर रहा है?

  • नहीं? एक बैच (बैच-फ़ेच द्वारा प्राप्त आइटम कैश में रखा जाता है) लाने करो
  • हाँ? विशेष आइटम के लिए कैश में देखें, अगर यह बैच-फ़ेच नहीं करता है।

तो यदि संग्रह में आइटम आप खोज रहे हैं तो कैश में आईएस फाउंड है तो बैच-फ़ेच नहीं होता है। यदि आइटम दूसरे-स्तर के कैश में नहीं मिलता है तो बैच फ़ेच होता है, लेकिन बैच किए गए आइटम कैश में हैं या नहीं, यह बैच किए गए आइटमों का एक रिचर्ड करेगा।


----- उदाहरण 1 -----

अच्छा:

(तीन एक संग्रह में आइटम - 3 के बैच का आकार) पहले जाने:

  • collection.getItem (0) - कोई कैश नहीं | बैच-फ़ेच 3 आइटम
  • संग्रह।GetItem (1) - द्वारा में भरी हुई बैच-फ़ेच
  • collection.getItem (2) - द्वारा में भरी हुई बैच-फ़ेच

अब, कहीं और, बाद में समय में:

  • संग्रह। GetItem (0) - कैश मारो
  • collection.getItem (1) - कैश मारो
  • collection.getItem (2) - कैश मारो

----- उदाहरण 2 -----

बुरा:

(एक संग्रह में तीन आइटम - के 3 बैच का आकार)

इस मामले में, सूचकांक 0 में आइटम था कैश से हटा दिया गया क्योंकि शायद कैश भरा था और आइटम गिरा दिया गया था, या आइटम बेकार या निष्क्रिय हो गया था।

  • collection.getItem (0) - नहीं में कैश ऐसा 3 के बैच (चयन * जहां में (,, आईडी)??)
  • collection.getItem (1) - पहले से ही कैश में (प्रतिस्थापित द्वारा वैसे भी बैच-फ़ेच)
  • collection.getItem (2) - कैश में पहले से ही (द्वारा बदल दिया वैसे भी बैच-फ़ेच)

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

http://opensource.atlassian.com/projects/hibernate/browse/HHH-1775

वोट इसे!

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