2012-07-05 8 views
16

का उपयोग करके थोक में इकाइयों का संग्रह सम्मिलित करना मैं एक फॉर्चैच लूप में संग्रह से प्रत्येक इकाई को सहेजने या अपडेट करने के लिए कॉल का उपयोग करके, फ्लैंट एनएचबर्ननेट का उपयोग करके तालिका में वस्तुओं का एक बड़ा संग्रह डालने का प्रयास कर रहा हूं। मैं बैच आकार को संग्रह के आकार में स्थापित कर रहा था, हालांकि मैंने आयेंड के ब्लॉग पर पढ़ा है जो इसे बड़े मूल्यों पर सेट करने की अनुशंसा नहीं की जाती है इसलिए मैंने इसे 250 पर कैप्चर किया है, हालांकि जब मैं एनएचप्रोफ में संग्रह को देखता हूं, तो मैं बैच किए गए सम्मिलित कॉल के सेट के बजाय सम्मिलित बयान (संग्रह लगभग 20000 आइटम) की एक स्ट्रीम देखें।Fluent NHibernate

यह बहुत अक्षम लगता है और यह एक लंबे समय से अधिक समय ले रहा है, जो कि संक्षेप में बहुत बुनियादी है - 25 कॉलम में मूल्य डालना (हाँ, यह एक जगह है जिसे बेहतर बनाया जा सकता है, लेकिन यह एक विरासत डेटाबेस है जिसे मैं अभी के लिए अटक गया हूं) एक SQL सर्वर 2008 डेटाबेस में - इसलिए मैं केवल यह मान सकता हूं कि मैं इसे गलत कर रहा हूं।

क्या NHibernate का उपयोग करके इकाइयों के बड़े संग्रह को सम्मिलित करने का एक अनुशंसित तरीका है? SaveOrUpdate पर सहेजें का उपयोग करके क्या कोई दक्षता प्राप्त हो सकती है? , थोड़ा अस्पष्ट प्रश्न के लिए

public void Add(IEnumerable<TEntity> entities) 
{ 
    var session = GetCurrentSession(); 
    using (var transaction = session.BeginTransaction()) 
    { 
     entities = entities.ToList(); 

     session.SetBatchSize(SetBatchSize(entities.Count())); 

     foreach (var entity in entities) 
      session.SaveOrUpdate(entity); 

     transaction.Commit(); 
    } 
} 

क्षमा याचना मैं: -

ऐड विधि संहिता SetBatchSize कॉल जहां बैच से 250 छाया हुआ है, या संग्रह आकार के लिए निर्धारित है अगर यह 250 से कम है मुझे लगता है कि मैं सिर्फ गलत तरीके से चीजों के करीब आ रहा हूं और किसी भी पॉइंटर्स की सराहना की जाएगी!

उत्तर

3

आप थोक आवेषण के लिए एक स्टेटलेस सत्र का उपयोग करना चाहेंगे।

(संबंधित: Inserts of stateless session of NHibernate are slow)

+1

धन्यवाद, मैं लिंक देखा है और यह भी डालने एक राज्यविहीन सत्र का उपयोग करने के साथ बदल, और यह वास्तव में कोई फर्क नहीं बनाया है। समस्या का एक हिस्सा यह है कि यह एक ब्राउनफील्ड ऐप है, और मेरे पास पहचान उत्पन्न करने का विकल्प नहीं है। जब कोई रिकॉर्ड दर्ज करता है तो स्कोप पहचान का अनुरोध किये बिना एनएच को डालने के लिए एनएच को मजबूर करने का कोई तरीका है? –

+1

अस्वीकरण: एनएचबीर्नेट को जो कुछ भी आप चाहते हैं उसके बारे में करने का एक तरीका है। लेकिन - इस मामले में, आप अपना मॉडल नहीं बदल सकते हैं। मैं तर्क दूंगा कि एनएच इस मामले में उचित उपकरण नहीं है। – hometoast

+1

धन्यवाद, यह उस तरह का निष्कर्ष है जिस पर मैं आऊंगा। मैंने विशेष रूप से किसी अन्य प्रश्न में स्कोप पहचान के बारे में पूछा है, अगर किसी को किसी भी तरह की जादूगर के बारे में पता है तो मैं नियोजित कर सकता हूं। –