2012-03-30 7 views
13

के साथ थोक सम्मिलन संचालन को तेज करें मैं ओरेकल 11 जी पर एनएचबीर्नेट 3.2 के साथ थोक insert संचालन को तेज करना चाहता हूं।NHibernate

lazily भूमिका का एक संग्रह प्रारंभ करने में विफल: इस मैं

Session.Save(entity); 
Session.Flush(); 
Session.Clear(); 

कोशिश की ... मेरी foreach पाश में लेकिन सत्र में लापता वस्तुओं के कारण एक अपवाद मिल गया ऐसा करने के लिए MyClass.PropertyX,

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property> 
    <property name="connection.connection_string">xxx</property> 
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property> 
    <property name="adonet.batch_size">50</property> 
    <property name="query.substitutions">true=1, false=0</property> 
    <property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate</property> 
    </session-factory> 
</hibernate-configuration> 
: कोई सत्र या सत्र बंद किया गया

एक और प्रयास बैच का आकार निर्धारित करने के लिए था

अतिरिक्त मैं अपने कोड में Session.SetBatchSize(50) सेट एक निम्न अपवाद है:

कोई बैच आकार सत्र कारखाने के लिए परिभाषित किया गया था, बैचिंग अक्षम है। बैचिंग सक्षम करने के लिए adonet.batch_size = 1 सेट करें।

एकमात्र स्थान जहां यह अपवाद फेंक दिया गया है NonBatchingBatcher है, तो ऐसा लगता है कि मेरे सत्र में गलत बैचर है।

यहां क्या गलत है? मैं NHibernate (statlese सत्रों का उपयोग किए बिना) के साथ बैच आवेषण कैसे बढ़ा सकता हूं?

+0

आपका पहला अपवाद वास्तव में क्या था? इसके अलावा, यदि आप लूप * के अंदर 'फ्लश' * करते हैं, तो आप कुछ भी बैच नहीं करेंगे। –

+0

@Diego Mijelshon ने अपवाद संदेश जोड़ा – deamon

+0

@deamon यह बहु-थ्रेड किसी भी तरह से है? – Newbie

उत्तर

1

आप सत्र को क्यों साफ़ कर रहे हैं?

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

स्यूडोकोड:

foreach (var i in allElements) 
{ 
    using (var tx = session.BeginTransaction()) 
    { 
     ... do what you have to do with the object 
     tx.Commit(); 
    } 
} 

गति बढ़ाने के लिए वहाँ अन्य चीजें हैं जो मदद कर सकते हैं कर रहे हैं - तुम क्या तुम सच में पाश में क्या करना चाहते हैं परिभाषित करने के लिए किया है।

35

काम करना चाहिए के बाद,

var testObjects = CreateTestObjects(500000); 

var stopwatch = new Stopwatch(); 
stopwatch.Start(); 
using (IStatelessSession session = sessionFactory.OpenStatelessSession()) 
using (ITransaction transaction = session.BeginTransaction()) 
{ 
    foreach (var testObject in testObjects) 
     session.Insert(testObject); 
    transaction.Commit(); 
} 

stopwatch.Stop(); 
var time = stopwatch.Elapsed; 

रेफरी: http://nhibernate.info/blog/2008/10/30/bulk-data-operations-with-nhibernate-s-stateless-sessions.html

+1

+1 कैसे जवाब देना चाहिए! मुझे समय बचाया – user919426

+0

क्या मुझे एक स्टेटलेस सत्र का उपयोग करने के बाद अपने कैश साफ़ करना चाहिए? या क्या स्टेटस सत्र स्टेटलेस सत्र द्वारा किए गए बदलाव उठाएंगे? –

4

सभी उपरोक्त युक्तियां बहुत ही वैध और बहुत उपयोगी हैं। संग्रह में से एक को जोड़ना चाहता था: लॉगिंग अक्षम करें। कंसोल में दिखाए गए आपके एसक्यूएल को ध्यान में धीमा कर दिया गया है, जैसा कि एनएचप्रोफ का उपयोग करके प्रोफाइलिंग करता है, ऑटो टिप्पणी और एनएलओजी या लॉग 4नेट के माध्यम से लॉग इन एसक्यूएल को सुंदर स्वरूपित करता है। हमारे मामले की स्थापना में:

cfg.AutoCommentSql = false; 
cfg.LogFormattedSql = false; 

सिर्फ 1 सेकंड से अधिक करने के लिए ~ 6 सेकंड से हमारे थोक डालने समय की कमी हुई। तो लॉगिंग करते समय आपको अधिक गंभीर समस्याओं को कम करने में मदद मिलेगी, यह अपने प्रदर्शन के हिट के साथ आता है!

0

मुझे पता है कि सवाल ओरेकल के बारे में था, लेकिन एसक्यूएल सर्वर के लिए मैं वर्ग मैपिंग लेने के लिए एक नियमित रूप से लिखने जा रहा था और SQLTulkInsert द्वारा उपयोग किए जाने वाले डेटाटेबल उत्पन्न करने जा रहा था, लेकिन मुझे पता चला कि किसी ने पहले से ही ऐसा किया है।

https://kaylaniam.wordpress.com/2015/03/13/nhibernate-and-sqlbulkcopy/

यह शायद एसक्यूएल सर्वर पर थोक आवेषण करने के लिए सबसे तेज़ तरीका है।

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

  • कोई संबंधित समस्या नहीं^_^