2009-06-11 7 views
10

मैं NHibernate वर्तमान में उपयोग कर रहा हूँ पर डेटाबेस के लिए 1000 से अधिक रिकॉर्ड सहेजा जा रहा है। मैं एक स्थिति है जहाँ मैं इस तरह डेटाबेस के लिए अभिलेखों का एक गुच्छा को बचाने की जरूरत है:एक समय

var relatedTopics = GetRelatedTopics(topic); 
foreach (var relatedTopic in relatedTopics /* could be anywhere from 10 - 1000+ */) 
{ 
    var newRelatedTopic = new RelatedTopic { RelatedTopicUrl = relatedTopic, TopicUrl = topic.Name }; 
    _repository.Save(newRelatedTopic); 
} 

जब स्पष्ट रूप से बहुत डेटाबेस है कि कई बार हिट करने के लिए हो रही चुंगी है इस को बचाने के लिए रिकॉर्ड की एक टन कर रहे हैं। बेहतर दृष्टिकोण क्या है? क्या कोई बैच अपडेट है जो मैं कर सकता हूं? क्या मैं डेटासेट का उपयोग कर बेहतर हूं?

धन्यवाद

+0

मैं डेविड पी के उत्तर को प्रश्न के समाधान के रूप में स्वीकार करता हूं। –

उत्तर

12

की स्थापना adonet.batch_size स्थिति में सुधार कर सकते हैं।

कि के लिए आपके पास राष्ट्रीय राजमार्ग विन्यास में

  • सेट adonet.batch_size को

उदाहरण:

m_sessionFactory = Fluently 
     .Configure() 
     .Database(MsSqlConfiguration 
      .MsSql2005 
      .ConnectionString(c => c.FromConnectionStringWithKey("testme")) 
      ) 
     .Mappings(m => m.FluentMappings 
      .AddFromAssemblyOf<TestImpl>()) 
     .ExposeConfiguration(config => 
     { 
      config.SetProperty("adonet.batch_size", "1"); 
      m_configuration = config; 
     }) 
     .BuildSessionFactory(); 
  • बस से पहले सत्र पर बैच आकार सेट बचाने

    using (ISession session = m_nhibernateSessionFactory.GetSession()) 
    using (var tx = session.BeginTransaction()) 
    {  
        session.SetBatchSize(1000);  
        foreach (var server in serverz) 
        { 
         session.SaveOrUpdate(server); 
        } 
        tx.Commit(); 
    } 
    
+0

क्या आप कृपया थोड़ी सी जानकारी दे सकते हैं? – Micah

+1

आप m_configuration क्यों सेट कर रहे हैं? मुझे SetBatchSize पर अभी भी एक त्रुटि मिलती है और मैं यह पता लगाने की कोशिश कर रहा था कि क्यों। मैं ओरेकल का उपयोग कर रहा हूं, शायद बैच आकार का समर्थन नहीं करता ?? –

1

डेटासेट? सं थोक डालें? हाँ।

आप डालने रहे हैं, तो यह है कि कई रिकॉर्ड और आवेषण बहुत साधारण हैं, तो आप थोक इंसर्ट कर रहे हैं और ORM बाहर खींच पर गौर करना चाहिए।

+0

क्या आप उस पर कुछ और बता सकते हैं? मैंने पहले कभी थोक आवेषण के साथ निपटाया नहीं है। धन्यवाद! – Micah

1

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

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

उचित मार्गदर्शन का संदर्भ लें: MySQL के लिए, नीचे देखें। यह उपयोगी है अगर आप लाखों रिकॉर्ड, या हजारों रिकॉर्ड अक्सर डाल रहे हैं। अन्यथा, सबसे अच्छा तुम कर सकते हो आवेषण के 1000s के साथ एक बड़ा एसक्यूएल बना सकते हैं और है कि अपने डेटाबेस कनेक्शन पर सीधे निष्पादित, लंघन ORMs और उनसे संबंधित सत्यापन है।

3

मुझे लगता है कि आपकी स्थिति के आधार पर आपके पास कई विकल्प हैं।

यदि आप NHibernate 2.1 अल्फ का उपयोग कर सकते हैं तो आप उपलब्ध नए निष्पादन योग्य एचक्यूएल का उपयोग करने का प्रयास कर सकते हैं।

http://nhibernate.info/blog/2009/05/05/nh2-1-executable-hql.html

टोबियास के जवाब के रूप में अच्छी तरह से काम करेगा। बैच आकार को बस सेट करना सम्मान को बढ़ाएगा।

आप ADO.Net के साथ गंदे अपने हाथ करना चाहते हैं ...

Sql सर्वर में थोक इंसर्ट कर Sql थोक कॉपी के उपयोग के माध्यम से संभव है।

कि का एक उदाहरण यहाँ है: http://dotnetslackers.com/articles/ado_net/SqlBulkCopy_in_ADO_NET_2_0.aspx

मेरे लिए यह लगता है कि आप एक नया डेटाबेस में किसी अन्य संस्था के आधार पर इकाई बना रहे हैं।मेरे लिए एक संग्रहीत प्रक्रिया का उपयोग करने के लिए एक आदर्श परिदृश्य की तरह लगता है।

4

मुझे इस पर विश्वास है कि आप क्या देख रहे हैं:

Bulk Data Operations With NHibernate's Stateless Sessions

अनिवार्य रूप से करने के बजाय एक ISession खोलने, आप एक IStatelessSession खोलें, और अपना hibernate.cfg.xml में आप सेट कर सकते हैं:

<property name="adonet.batch_size">100</property> 
संबंधित मुद्दे