2009-02-18 8 views
7

हाय मैं एक प्रोजेक्ट काम कर रहा हूं जहां हमें दिन में एक बार कई एक्सएमएल फाइलों को संसाधित करने की आवश्यकता होती है और उन फ़ाइलों में निहित जानकारी के साथ डेटाबेस को पॉप्युलेट करना पड़ता है।NHibernate थोक डालने या अद्यतन

प्रत्येक फ़ाइल लगभग 1 एमबी है और इसमें लगभग 1000 रिकॉर्ड हैं; हमें आमतौर पर इन फ़ाइलों में से 12 और 25 के बीच प्रक्रिया करने की आवश्यकता होती है। मैंने NHibernate का उपयोग करके थोक प्रविष्टियों के बारे में कुछ जानकारी देखी है, लेकिन हमारी समस्या किसी भी तरह की चाल है क्योंकि एक्सएमएल फाइलों में अद्यतन रिकॉर्ड के साथ नए रिकॉर्ड शामिल हैं।

एक्सएमएल में एक ध्वज है जो हमें बताता है कि एक विशिष्ट रिकॉर्ड एक नया रिकॉर्ड है या मौजूदा रिकॉर्ड में अपडेट है, लेकिन यह नहीं कि कौन सी जानकारी बदल गई है। एक्सएमएल रिकॉर्ड में हमारे डीबी पहचानकर्ता नहीं होते हैं, लेकिन हम अपने डीबी में रिकॉर्ड को विशिष्ट रूप से पहचानने के लिए एक्सएमएल रिकॉर्ड से पहचानकर्ता का उपयोग कर सकते हैं।

हमारी रणनीति अब तक पहचानने के लिए है कि वर्तमान रिकॉर्ड एक सम्मिलन या अद्यतन है या नहीं, इसके आधार पर हम या तो डीबी पर एक सम्मिलित करते हैं या हम एक खोज करते हैं, फिर हम ऑब्जेक्ट पर जानकारी को अपडेट करते हैं एक्सएमएल रिकॉर्ड से आने वाली जानकारी और आखिर में हम डीबी पर अपडेट करते हैं।

हमारे वर्तमान दृष्टिकोण के साथ समस्या यह है कि हमें डीबी ताले के साथ समस्याएं हैं और हमारा प्रदर्शन वास्तव में तेज़ हो जाता है। हमने कुछ विकल्पों के बारे में सोचा है जैसे कि अलग-अलग परिचालनों के लिए अलग-अलग टेबल या यहां तक ​​कि अलग डीबी के लिए अलग-अलग तालिकाओं के बारे में सोचा है, लेकिन इस तरह के कदम से ऐसा करने का एक बड़ा प्रयास होगा, इससे पहले कि मैं इस मामले पर समुदाय की राय के लिए पूछना चाहूंगा, अग्रिम धन्यवाद।

उत्तर

17

विचारों के एक जोड़े:

  • हमेशा थोक संचालन के लिए IStatelessSession उपयोग करने के लिए प्रयास करें।
  • आप अभी भी प्रदर्शन से खुश नहीं हैं, तो सिर्फ NHibernate छोड़ सकते हैं और एक संग्रहीत प्रक्रिया या पैरामिट्रीकृत क्वेरी इस के लिए विशिष्ट उपयोग करें, या IQuery.ExecuteUpdate()
  • का उपयोग आप SQL सर्वर का उपयोग कर रहे हैं, तो आप करने के लिए अपने xml प्रारूप में परिवर्तित कर सकते BCPFORMAT xml तब उस पर बल्क इन्टरेट चलाएं (केवल प्रविष्टियों के लिए)
  • यदि आपके पास बहुत से डीबी लॉक हैं, तो संचालन को समूहबद्ध करने का प्रयास करें (यानी पहले पता लगाएं कि क्या डालने की आवश्यकता है और क्या अपडेट किया गया है, फिर अपडेट के लिए पीके प्राप्त करें , फिर सम्मिलन के लिए बल्क इन्टरेट चलाएं, फिर अपडेट चलाएं)
  • यदि स्रोत फ़ाइलों को पार्स करना एक प्रदर्शन समस्या है (यानी यह एक सीपीयू कोर को अधिकतम करता है), इसे समानांतर में करने का प्रयास करें (आपका उपयोग कर सकते हैं 210)