البرمجة

تحسين أداء قواعد البيانات في ASP.NET MVC باستخدام Async/Await

في عالم تطوير تطبيقات ASP.NET MVC، تحدث العديد من التحديات عند التعامل مع استعلامات قاعدة البيانات التي يمكن أن تستفيد من تشغيلها بشكل متزامن أو متوازٍ. في هذا المقال، سنستعرض الطرق الصحيحة لتحقيق ذلك باستخدام مفهوم async/await في C#.

أولاً وقبل كل شيء، يجب فهم فائدة استخدام async/await. هؤلاء الكلمتين الرئيسيتين تتيحان لك تحويل الكود إلى تشغيل غير متزامن، حيث يمكن للتطبيق الخاص بك القيام بأنشطة أخرى أثناء انتظار الاستعلامات من قاعدة البيانات.

للبداية، يجب عليك تعديل الطريقة التي تتعامل بها مع الاستعلامات. قم بتحويل الاستعلامات إلى دوال async باستخدام الكلمة الرئيسية “async” واستبدل “ExecuteNonQuery” بـ “ExecuteNonQueryAsync”. ستصبح الدوال الآن متزامنة وستتيح للتطبيق القيام بأنشطة أخرى أثناء انتظار النتائج.

في الكود التالي، يتم توضيح كيف يمكنك بدء تنفيذ الاستعلامات بشكل متوازٍ باستخدام async/await:

csharp
public async Taskstring, int>> ExecuteDatabaseQueriesAsync() { var recordedStatistics = new Dictionary<string, int>(); using (var dbc = new SqlConnection(db.Database.Connection.ConnectionString)) { await dbc.OpenAsync(); recordedStatistics.Add("mergeOne", await ExecuteMergeProcedureAsync("MergeOneProcedure", MergeOneDataTable)); recordedStatistics.Add("mergeTwo", await ExecuteMergeProcedureAsync("MergeTwoProcedure", MergeTwoDataTable)); recordedStatistics.Add("mergeThree", await ExecuteMergeProcedureAsync("MergeThreeProcedure", MergeThreeDataTable)); recordedStatistics.Add("mergeFour", await ExecuteMergeProcedureAsync("MergeFourProcedure", MergeFourDataTable)); recordedStatistics.Add("mergeFive", await ExecuteMergeProcedureAsync("MergeFiveProcedure", MergeFiveDataTable)); dbc.Close(); } return recordedStatistics; } private async Task<int> ExecuteMergeProcedureAsync(string procedureName, DataTable dataTable) { using (var cmd = new SqlCommand(procedureName, dbc)) { cmd.CommandTimeout = 300; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@TVP", dataTable); return await cmd.ExecuteNonQueryAsync(); } }

يمكنك الآن استدعاء ExecuteDatabaseQueriesAsync من أي مكان في تطبيقك باستخدام await للحصول على النتائج. هذا الأسلوب يسمح بتنفيذ الاستعلامات بشكل متزامن وفعال من حيث استخدام الموارد، حيث يمكن تشغيل الاستعلامات المختلفة بشكل متزامن دون الحاجة إلى انتظار الاستعلام السابق.

المزيد من المعلومات

بالتأكيد، يُمكن تحسين الكود السابق وتوسيع النقاش لفهم تفاصيل أكثر حول كيفية تحسين أداء التطبيق وتحقيق أفضل فعالية. دعونا نستكمل النقاش.

  1. استخدام async/await بشكل صحيح:

    • تأكد من استخدام await في الأماكن المناسبة للحفاظ على تسلسل التنفيذ وضمان عدم حدوث تأخير في البرنامج.
    • يُفضل أيضًا استخدام OpenAsync و ExecuteNonQueryAsync للتعامل مع الاتصال بقاعدة البيانات بشكل غير متزامن.
  2. إدارة اتصالات قاعدة البيانات:

    • يمكنك استخدام using مع OpenAsync لضمان إغلاق اتصال قاعدة البيانات بشكل صحيح حتى في حالة حدوث استثناء.
    • قد تكون هناك فائدة في استخدام بيئة try-catch للتعامل مع أي استثناء يمكن أن يحدث أثناء تنفيذ الاستعلامات.
  3. استخدام Task.WhenAll:

    • يمكنك استخدام Task.WhenAll لتنفيذ عدة استعلامات بشكل متزامن والانتظار حتى اكتمال جميعها.
  4. تحسين الأداء:

    • قد تحقق من أداء الاستعلامات الخاصة بك وتحسينها قدر الإمكان، فربما هناك فهم أفضل للفهرس والتحسينات الممكنة في الاستعلامات.
  5. استخدام الحد الأقصى للاتصال بقاعدة البيانات:

    • يُفضل استخدام الحد الأقصى لعدد الاتصالات بقاعدة البيانات لتحسين أداء التطبيق.

قد تحتاج أيضًا إلى التحقق من إصدار Entity Framework الذي تستخدمه للتأكد من دعمه الكامل لـ async/await، وتحقق من أن تكون إعدادات الاتصال بقاعدة البيانات الخاصة بك مُحسَّنة.

باستخدام هذه الأفكار وتطبيقها، يُمكنك تحسين أداء التطبيق الخاص بك وتحقيق تنفيذ متزامن وفعّال للعمليات الخاصة بقاعدة البيانات.

زر الذهاب إلى الأعلى