سؤال

وفي وقت سابق من اليوم لقد وجدت خلل في واحدة من مشاريعنا - هناك conenction مع قاعدة البيانات التي يتم إغلاق أبدا، أعني ما يسمى انهيار طريقة () أبدا. ومع ذلك، عند إغلاق التطبيق، يتم إغلاق الاتصال (محددة في SQL Server Studio إدارة عدة مرات). لماذا؟

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

المحلول

والاتصال سوف يغلق عند إنهاء التطبيق. تقرأ على SqlConnection لوضع الصيغة النهائية . من الوثائق MSDN ل Object.Finalize :

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

نصائح أخرى

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

// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
    conn.Open();
    // database code here with no explicit close

}

وهذا هو المعادل الوظيفي من حاول / منع أخيرا مع conn.close في نهاية المطاف. تطل العديد من المشروعات الإنمائية الكتل باستخدام - تأكد من أنك لا تفعل الشيء نفسه في هذه الحالة

.

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

والاتصالات SQL غالية لخلق ويستخدم ADO.NET تقنية تسمى تجمع الاتصال الذي يسمح لإعادة استخدامها.

MSDN :

<اقتباس فقرة>   

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

     

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

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

عند تعطل التطبيق، وربما finalizer لن يتم تشغيل، وترك اتصال مفتوح الماضي عمر التطبيق.

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