2008-11-16 11 views
6

पर स्मृति में सभी रिकॉर्ड्स पढ़ने से बचें मेरे पास डेटाबेस में बड़ी मात्रा में पंक्तियां हैं जिनसे मुझे XML दस्तावेज़ बनाना होगा। मैं हाइबरनेट 3 का उपयोग कर रहा हूं। मानदंड और क्वेरी इंटरफेस में मूल सूची() विधि खतरनाक लगती है: मुझे लगता है कि यह सभी रिकॉर्ड्स को मेमोरी में पढ़ने के लिए काफी कुछ है, भले ही मैं केवल उन पर पुन: प्रयास करता हूं। या क्या कुछ आलसी लोडिंग जादू है? यदि नहीं, तो मुझे लगता है कि दो विकल्प शेष हैं: क्वेरी से स्क्रॉल() या iterate() का उपयोग करके (स्क्रॉलिया में स्क्रॉल भी मौजूद है)। अगर मैं न्यूनतम एसक्यूएल राउंडट्रिप्स रखना चाहता हूं तो यह बहुत अच्छा नहीं दिखता है: "पहली एसक्यूएल क्वेरी केवल पहचानकर्ता लौटाती है"। तो क्या मैं सही हूं, क्या मुझे इसके लिए स्क्रॉल() का उपयोग करना है?हाइबरनेट:

+0

यह सामान एनएचबीरनेट पर भी लागू होता है :) –

उत्तर

1

मानदंड पर setMaxResults() विधि का उपयोग करें।

Criteria crit = sess.createCriteria(Cat.class); 
crit.setMaxResults(maxResults); 
crit.setFirstResult(firstResultIndex); 
List cats = crit.list(); 

http://hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html

+0

मैं क्या करना चाहता हूं, लेनदेन संबंधी फैशन में सभी परिणाम हैं। मैं इकट्ठा करता हूं कि आपका मतलब है कि मुझे भागों से पूरे बड़े परिणाम बनाना चाहिए। क्या मैं इन्हें अपने लगातार, बड़े परिणामस्वरूप "सिलाई" करने के लिए उपयोग कर सकता हूं ताकि मुझे वास्तव में एक निश्चित समय से स्नैपशॉट मिल सके। – auramo

+0

मुझे यकीन नहीं है कि "लेनदेन संबंधी फैशन में सभी परिणाम क्या हैं" से आपका क्या मतलब है। –

+0

मेरा मतलब यह है कि मेरा परिणाम एक स्नैपशॉट है, अन्य क्लाइंट्स के बीच होने वाली कोई भी लिखने/हटाना उस पर असर नहीं डालता है। – auramo

-1

इसके अलावा, बैच धारा 19.1.4 और 19.1.5 करना चाहिए प्राप्त करते समय पर एक नजर है।

Insert into BatchTable (ID, Seq) Select (O.ID, Sequence.Next) 
From MyObject O Where ... 

कार्यभार की छोटी इकाइयों में वस्तुओं में: मैं निर्यात करने के लिए की जरूरत है सभी पंक्तियों के वस्तु आईडी के साथ एक अस्थायी तालिका बनाएँ: http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#queryhql-joins-forms

+0

क्या आप जानते हैं कि उन बैच-प्रश्न (उदाहरण के लिए उदाहरण में 10, 10 और 5 बिल्लियों) सूची में सभी समाप्त होते हैं (यदि मैं सूची में तालिका() के साथ तालिका में क्वेरी करता हूं, जबकि मैं इसे फिर से चलाता हूं? या हाइबरनेट को अनलोड कर सकता है पहली बैच जब मैं अगले बैच पर आगे बढ़ता हूं (उदाहरण के लिए पहली 10 बिल्लियों के बाद अगली 10 बिल्लियों)। – auramo

0

यह मैं कर रही पर योजना बना रहा हूँ है :

Select Min(B.Seq), Max(B.Seq) From BatchTable; 

for (batch = minBatch; batch <= maxBatch; batch += size) { 
beginTransaction(); 
results = query("Select O From MyObject O, BatchTable B 
        Where O.ID = B.ID and (? <= B.Seq AND B.Seq < ?)"); 

exportXML(results); 
for (MyObject O : results) { 
    O.setProcessed(True); 
    O.update(); 
} 
commit(); 
} 
1

आप के रूप में procesed बंद वस्तुओं को चिह्नित करने की जरूरत नहीं है, तो आप बस स्क्रॉल() का उपयोग करें और सत्र से वस्तुओं को बेदखल के रूप में आप उन लोगों के साथ किया जाता है कर सकते हैं।

2

उपयोग करने का प्रयास इस के साथ संयोजन के रूप में स्क्रॉल():

http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/StatelessSession.html

डेटाबेस के आधार पर थोक ऑपरेशनों को करने के लिए एक कमांड उन्मुख एपीआई।

एक स्टेटलेस सत्र प्रथम स्तर के कैश को लागू नहीं करता है और न ही किसी दूसरे-स्तर के कैश के साथ बातचीत करता है, न ही यह लेनदेन संबंधी लेखन-पीछे या स्वचालित गंदे जांच को कार्यान्वित करता है, न ही संचालन को संबंधित उदाहरणों पर कैस्केड करता है। एक स्टेटलेस सत्र द्वारा संग्रहों को नजरअंदाज कर दिया जाता है। एक स्टेटलेस सत्र बाईपास हाइबरनेट के इवेंट मॉडल और इंटरसेप्टर के माध्यम से किए गए ऑपरेशंस। प्रथम स्तर के कैश की कमी के कारण स्टेटलेस सत्र डेटा एलियासिंग प्रभावों के प्रति संवेदनशील हैं।

कुछ प्रकार के लेनदेन के लिए, एक स्टेटलेस सत्र एक राज्य सत्र से थोड़ा तेज प्रदर्शन कर सकता है।