هل تريد فتح اتصال قاعدة البيانات مرة واحدة أو في كل إجراء لقاعدة البيانات؟

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

سؤال

أقوم حاليًا بإنشاء بوابة ويب باستخدام ASP.NET والتي تعتمد بشكل كبير على استخدام قاعدة البيانات.في الأساس، كل استعلام GET (تقريبًا كل :P ) من أي مستخدم سيؤدي إلى استعلام إلى قاعدة البيانات من خادم الويب.

الآن، أنا جديد حقًا في هذا الأمر، وأنا قلق جدًا بشأن الأداء.ونظرًا لقلة خبرتي في هذا المجال، لا أعرف حقًا ما يمكن توقعه.

سؤالي هو، باستخدام ADO.NET، هل سيكون الخيار الأكثر ذكاءً هو ترك اتصال ثابت مفتوحًا من خادم الويب إلى قاعدة البيانات، ثم التحقق من سلامة جانب خادم الاتصال هذا قبل كل استعلام إلى قاعدة البيانات؟- أو هل من الأفضل أن أفتح الاتصال قبل كل استعلام ثم أغلقه بعد ذلك؟

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

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

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

المحلول

وأنت الطريق في وقت مبكر لتكون مثيرة للقلق حول الأداء.

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

وشيء من هذا القبيل ...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

نصائح أخرى

من الأفضل أن ندع ADO.NET التعامل مع تجمع الاتصالات. انها سوف تستمر في الاتصال إذا كان يعتقد أنه يحتاج إليه، ولكن لا تستخدم كائن اتصال ثابت. أن رائحة فقط. سيكون من الأفضل لتمرير كائن الاتصال حول لطرق التي تحتاج إليها، وإنشاء الاتصال في كتلة using.

ويجب عليك دائما إغلاق الاتصال بعد الانتهاء من التفاعل DB الخاص بك. ADO.NET لديها تجمع الاتصال والتي سوف تأخذ الرعاية من كفاءة إعادة الاتصال. عند فتح 2، 3 والاتصالات اللاحقة - أنها سوف تؤخذ من تجمع مع ما يقرب من أي إرهاق

وآمل أن يساعد هذا.

ويهمني ان يكون التفكير أكثر حول التخزين المؤقت من تجمع الاتصالات المتقدمة. كل الحصول يتطلب ضرب قاعدة البيانات؟

إذا في بوابة كنت قد حصلت على المحتوى المشترك والمحتوى الخاصة بالمستخدم، وذلك باستخدام ذاكرة التخزين المؤقت يمكنك تخزين العناصر المشتركة وكذلك مع مفتاح المهترئ (مع هوية المستخدمين) يمكنك تخزين بنود محددة المستخدم.

وADO.NET لا تجمع الاتصالات. عند استدعاء وثيق على اتصال الاعتراض أنها سوف تبقي الاتصال في تجمع إجراء الاتصال القادم أسرع بكثير.

وحدس الأولي الخاص بك هو الصحيح. ما تحتاجه هو قاعدة بيانات اتصال تجميع.

وأنت بالتأكيد لا تريد فتح اتصال لكل مكالمة قاعدة البيانات، التي من شأنها أن تؤدي إلى فقر مدقع الأداء بسرعة كبيرة. إنشاء قاعدة بيانات تربط مكلفة للغاية.

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

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

لنكون صادقين، وأتوقع تجميع لتحدث بشكل افتراضي في أي مكتبة قاعدة بيانات التجريد (مع وجود خيار متاح لتعطيله). ويبدو أن ADO.NET يفعل ذلك.

حقا السؤال الأول الذي يجب طرحه هو لماذا هل أنت قلق للغاية بشأن الأداء؟ما هو حجم العمل المتوقع لديك؟هل حاولت ذلك حتى الآن؟

ولكن بشكل عام، نعم، من الأفضل أن يكون لديك اتصال مفتوح تحتفظ به لفترة من الوقت بدلاً من إعادة فتح اتصال قاعدة البيانات في كل مرة؛اعتمادًا على نوع الاتصال ومشكلات الشبكة ومرحلة القمر، قد يستغرق الأمر جزءًا كبيرًا من الثانية أو أكثر لإجراء اتصال أولي؛إذا كان عبء العمل لديك بحيث تتوقع أكثر من GET كل خمس ثوانٍ أو نحو ذلك، فسوف تكون أكثر سعادة مع اتصال دائم.

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