ما مدى سوء فتح وإغلاق اتصال SQL لعدة مرات؟ما هو التأثير الدقيق؟

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

سؤال

على سبيل المثال، أحتاج إلى ملء الكثير من DataTables باستخدام طريقة SQLDataAdapter's fill():

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....

حتى أن كافة كائنات dataadapter تستخدم نفس SQLConnection، فإن كل أسلوب تعبئة سيفتح الاتصال ويغلقه ما لم تكن حالة الاتصال مفتوحة بالفعل قبل استدعاء الأسلوب.

ما أريد معرفته هو كيف يؤثر فتح وإغلاق SQLConnections دون داع على أداء التطبيق.ما مقدار الحاجة إلى التوسع لرؤية التأثيرات السيئة لهذه المشكلة (100000 من المستخدمين المتزامنين؟).في موقع ويب متوسط ​​الحجم (يستخدمه 50000 مستخدم يوميًا)، هل يستحق الأمر البحث عن جميع استدعاءات fill() وإبقائها معًا في الكود وفتح الاتصال قبل أي استدعاء fill() وإغلاقه بعد ذلك؟

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

المحلول

يحتوي ADO.NET على تجمع للاتصالات، على سبيل المثال.عندما تغلق اتصالاً، فهو ليس مغلقًا تمامًا، ولكن "يُعاد تدويره" إذا طلبت اتصالاً جديدًا بنفس سلسلة الاتصال تمامًا.

ومع ذلك - إذا كنت بالفعل يعرف في وقت مبكر، سيتعين عليك استدعاء طرق التعبئة الخمس هذه واحدة تلو الأخرى، أوصي بها بالتأكيد

  • فتح الاتصال
  • قراءة جميع جداول البيانات الخمسة من قاعدة البيانات
  • إغلاق الاتصال مرة أخرى على الفور

من أفضل الممارسات المقبولة القيام بذلك بهذه الطريقة، فهي لا تؤذيك - لذا افعلها فقط!:-)

مارك

ملاحظة:بالطبع، لا يعمل تجمع الاتصالات في ADO.NET إلا إذا لم تقم بإيقاف تشغيله!:-) يتم تشغيله افتراضيًا - وسيتعين عليك تعطيله بشكل صريح.

نصائح أخرى

النقطة الأساسية:

  • لماذا فتح الاتصالات والاحتفاظ بها وإعادة استخدامها؟

    أداء

هناك العديد من الأسباب التي قد تجعلك ترغب في فتح وإغلاق الاتصالات.عليك أن تقرر أين ستكون أفضل مقايضة لك يستخدم.يمكنك القيام بالأمرين التاليين:استخدام اتصال مفتوح لفترة من الوقت و/أو عدد محدد من المعاملات، ثم إغلاقه وفتح اتصال جديد.

فتح وإغلاق اتصالات SQL هو غالي عند مقارنتها بالمهام البسيطة الأخرى في قاعدة البيانات.لكن اذا لك المهمة الفعلية تستغرق وقتًا طويلاً بالفعل، وقد لا يتم ملاحظة الحمل الإضافي (إذا كنت تخفي بالفعل فترة الانتظار للمهمة الفعلية - حتى لا يبدأ المستخدم في النقر بشكل عشوائي على الأشياء - مثل إعادة المحاولة).

حالة اختبار:

يمكنك قياس لك الفرق عن طريق كتابة نسختين من استعلام اختبار.حدد أي مهمة SQL بسيطة (يجب أن تكون نفس في كل نسخة).

في الإصدار واحد, ، افعل ذلك من خلال اتصال مفتوح ثابت واحد الخارج الحلقة، التكرار من خلال مهمتك البسيطة X عدد المرات.

في ال ثانية, افعل ذلك مع فتح وإغلاق الاتصال داخل الحلقة.

قم بتغيير عدد X من المرات للمطابقة لك الاستخدام والتوقعات.من المفترض أن يمنحك ذلك شعورًا جيدًا بالتأثير لك نظام.

نأمل أن يساعدك ذلك على فهم الأساسيات...جاك.

إجابة نكرو:أفضل طريقة هي وضع الاتصال في عبارة "استخدام" بحيث يتم تحديد نطاقه للعمل الذي يجب القيام به:

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top