ASP.NET/ADO.NET: معالجة العديد من اتصالات قاعدة البيانات داخل كائن. NET؟

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

سؤال

لدينا كائن .NET أن يفعل الكثير من القراءة / الكتابة مع قاعدة البيانات. طوال دورة حياة هذا الكائن (أو صفحة ASP الذي يستخدم فيه)، فإنه قد ضرب قاعدة البيانات مع استعلام / تحديث في أي مكان 1-10 مرات.

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

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

والبديل الآخر هو لفتح وإغلاق اتصال قاعدة البيانات قبل وبعد كل استعلام / العملية.

ما هي أفضل الممارسات هنا من أجل تحقيق أقصى قدر من الأداء؟

و**** **** التحديث شكرا للنصائح يا شباب. يمكن لأي شخص أن يتحدث أكثر لطريقة فتح / إغلاق اتصال داخل الأحداث مثيل / إنهاء كائن وتداعيات ذلك؟

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

المحلول

وفتح قريب اتصال حسب الحاجة. وقد بنيت ADO.NET في تجمع الاتصال الذي يعمل. أنك لن تلاحظ أي مشكلات في الأداء إلا إذا كنت تفعل هذا في حلقة مع الآلاف من فتح / إغلاق.

تحرير انظر href="https://stackoverflow.com/questions/247247/should-i-persist-a-sqlconnection-in-my-data-access-layer"> للحصول على مزيد من المعلومات فيما يتعلق مطبات استمرار الاتصال.

نصائح أخرى

وفتح وإغلاق كل مرة ... فتح على الفور (في أقرب وقت ممكن) قبل سطر من التعليمات البرمجية التي فعلية يقوم بإجراء عملية قاعدة البيانات، وأغلق في أقرب وقت ممكن بعد ذلك على الفور. عند القيام بذلك بهذه الطريقة، ADO.net لا فعلا إغلاق الاتصال، انها مجرد تطلق مرة أخرى في اتصال ADO.net بركة، حيث يجلس وينتظر الطلب التالي للاتصال مع سلسلة conenction نفسها. انك لم تكبد ovberhead من الواقع إعادة الاتصال في كل مرة ...

والمسألة الوحيدة هي إذا كنت تفعل بشكل غير متزامن العديد من محاولات الاتصال الذي يتجاوز الحد الأقصى لعدد الاتصالات في تجمع .... وهناك حلول لهذه المسألة أيضا، باستخدام فئة System.Threading.ThreadPool. ..

لإضافة إلى الثقة في تجمع الاتصال حجة - عقد اتصال مفتوحة لفترة أطول من اللازم يمكن أن <م> في الواقع انخفاض الأداء العام، كما تجمع الاتصال لا يمكن مشاركة هذا الصدد إلى المكونات الأخرى التي تحتاج إلى DB الاتصال.

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

وحتى عندما ado.net لا يغلق في الواقع الصدد، عندما تفعل: Conn.Close () ينفذ "sp_reset_connection" في الخادم، حتى عندما sp_reset_connection هو إجراء مخزن خفيفة الوزن، وتوليد بعض حركة مرور الشبكة. هكذا على سبيل المثال، أنا لا أوصي إغلاق وفتح اتصال داخل حلقة.

scroll top