معالجة الآلاف من أوامر SqlCommands باستخدام SqlTransaction تسبب استثناء في الذاكرة

StackOverflow https://stackoverflow.com//questions/11675430

سؤال

لقد قمت بكتابة وظيفة النسخ المتماثل المخصصة في تطبيق نماذج Windows C# القياسي مع قاعدة بيانات SQL Server 2008 Express.يقوم بشكل أساسي بسحب مجموعة من عبارات SQL التي يجب تنفيذها على قاعدة بيانات المشتركين.عند التحديث الكامل، يمكن أن يؤدي ذلك إلى تشغيل ما يصل إلى 200 ألف+ من العبارات التي يجب تنفيذها.

أقوم بمعالجة هذه البيانات داخل كتلة التعليمات البرمجية كما هو موضح أدناه:

using (SqlConnection connection = ConnectionManager.GetConnection())
{
     connection.Open();

     SqlTransaction transaction = connection.BeginTransaction();

     // Process 200k+ Insert/Update/Delete statements using SqlCommands

     transaction.Commit
}

ما أجده هو أن استخدام ذاكرة تطبيقاتي يظل مستقرًا إلى حد ما عند حوالي 40 ميجابايت لأول 30 كيلو بايت من البيانات.وبعد ذلك يبدو فجأة أنه يقفز إلى حوالي 300 ميجابايت ثم ينمو حتى أصطدم باستثناء OutOfMemory.

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

شكرًا.

يحرر:

بعد إعادة تشغيل جهاز الكمبيوتر الخاص بي، تمكنت من الحصول على نسخة متماثلة كاملة تبلغ 200 كيلو بايت +.على الرغم من أنه قد زاد في وقت ما في استخدام الذاكرة إلى 1.4 جيجا بايت بعد اكتمال النسخ المتماثل، إلا أن استخدام الذاكرة انخفض إلى 40 ميجا بايت.مما يقودني إلى استنتاج أن شيئًا ما داخل حلقتي يعالج الأوامر ربما يتسبب في نمو الذاكرة.

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

المحلول

أنت Disposing النماذج الخاصة بك والضوابط التي يمكن التخلص منها قبل الإغلاق؟

لف كافة الكائنات التي يمكن التخلص منها في بيان الاستخدام.انقر هنا لمزيد من التفاصيل


لا تفتح/تغلق الاتصال مرارًا وتكرارًا، بل قم بإرسال البيانات إلى قاعدة البيانات في معاملة واحدة.انقر هنا لمزيد من التفاصيل


لا يزال تطبيقك يحتفظ بالكثير من الذاكرة، فأنت بحاجة إلى طبيب مثل Red Gate Ants Memory Profiler.انقر هنا لرؤية المزيد من التفاصيل حول هذا الموضوع

enter image description here


هل يمكنني معالجة العديد من البيانات داخل معاملة واحدة؟

لديك الخيارات أدناه للقيام بذلك ...

  1. إدراج السائبة وتشغيل السجلات في Stored Proc.
  2. يحضر XML وأرسل السلسلة Database.
  3. أرسل للقراءة فقط DataTable في خادم Sql من خلال Stored Proc

عينة مخزنة بروك

Begin Try
    Set NoCount ON
    Set XACT_Abort ON
    Begin TRan
        --Your queries
    Commit Tran

Begin Tran

Begin Catch
    Rollback Tran
End Catch

تاكد من Dispose الكائنات مرة واحدة لا تكون قيد الاستخدام.


ينبغي أن يكون مثل هذا

using (SqlConnection connection = new SqlConnection())
{
    connection.Open();
    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        transaction.Commit();
    }
}

هل تأكدت من SqlCommand أيضًا؟

using (SqlCommand cmd = new SqlCommand())
{
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top