سؤال

أنا أستخدم أحمق حاليا. لدي موقف حيث أحتاج إلى حفظ مجموعة من السجلات إلى قاعدة البيانات مثل هذا:

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);
}

عندما يكون هناك طن من السجلات لحفظ ذلك، من الواضح أنه ضرائب للغاية في الاضطرار إلى ضرب قاعدة البيانات عدة مرات. ما هو النهج الأفضل؟ هل هناك نوع من التحديث الدفعي يمكنني القيام به؟ هل أنا أفضل حالا باستخدام DataSet؟

شكرًا

هل كانت مفيدة؟

المحلول

تحديد adonet.batch_size يمكن تحسين الوضع.

لذلك لديك ل

  • اضبط adonet.batch_size في تكوين NH

مثال:

    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();
    }
    

نصائح أخرى

انا اؤمن ان هذا ما تبحث عنه:

عمليات البيانات بالجملة مع جلسات Nibernate غير الجنسية

في الأساس بدلا من فتح iSession، يمكنك فتح istulessysession، وفي Hibernate.cfg.xml يمكنك تعيين:

 <property name="adonet.batch_size">100</property>

أعتقد أن لديك عددا من الخيارات اعتمادا على موقفك.

إذا كنت تستطيع استخدام Nibernate 2.1 Alphas، فيمكنك محاولة استخدام HQL القابلة للتنفيذ الجديد المتوفرة.

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

إجابة توبياس ستعمل كذلك. مجرد إعداد حجم الدفعة سوف تزيد من الأداء

إذا كنت تريد القذرة يديك مع ADO.NET ...

القيام بالأجهزة السائبة في SQL Server ممكن من خلال استخدام نسخة سائبة SQL.

مثال على ذلك هنا: http://dotnetslackers.com/articles/ado_net/sqlbulkcopy_in_ado_net_2_0.aspx.

بالنسبة لي يبدو أنك تخلق كيانا جديدا يعتمد على كيان آخر في قاعدة البيانات. بالنسبة لي يبدو أنه سيناريو مثالي لاستخدام إجراء مخزن.

DataSet؟ رقم السائبة إدراج؟ نعم.

إذا كنت تقوم بإدراج العديد من السجلات والإدراجات مبسطة للغاية، فيجب عليك أن تنظر إلى إدراج السائبة وسحب ORM.

أسرع طريقة لإدراج السجلات هي إنشاء ملف نصي واستخدام بناء جملة ملف تحميل. تحتوي معظم قواعد البيانات على تطبيقات سريعة بشكل ملحوظ لاستيراد ملفات البيانات إلى قواعد البيانات. ل mysql، انظر أدناه:

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

لقواعد البيانات الأخرى، الرجوع إلى الدليل المناسب. هذا مفيد إذا كنت تقوم بإدراج مليون سجل، أو الآلاف من السجلات بشكل متكرر. خلاف ذلك، فإن أفضل ما يمكنك القيام به هو إنشاء SQL كبيرا مع 1000s من إدراج وتنفيذ ذلك في اتصال قاعدة البيانات مباشرة، تخطي أورامهم والصلاحيات ذات الصلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top