سؤال

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

وبالتالي؛ ما هي الطريقة الموصى بها في التعامل مع الجلسات؟ ماذا يجب أن يكون عمرهم؟ جلسة واحدة العلاقات العامة؟ جلسة واحدة Singleton للتعامل مع كل شيء؟ أو ماذا؟

يحرر:

لاحظ أن بنية التطبيق الخاصة بي هي تطبيق سطح المكتب يتواصل مع خدمة جانبية خادم، وهو ما هو كل معالجة قاعدة البيانات، باستخدام Nibernate + بطلاقة. (إذا كان هذا يجعل أي فرق ...)

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

المحلول

تريد استراتيجية إدارة الجلسة التي تسمح لتطبيقك بالعمل بفعالية والاستفادة من الأشياء التي يمنحك nhibernate - الأبرز مخزن التخزين المؤقت والتحميل كسول.

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

قاعدة الإبهام هي: يجب أن يكون عمر الجلسة طويلا بما يكفي لأنك لم تستمر كائنات شنقا في نطاقها بعد انتهاء الجلسة.

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

في حالتك، مع خدمة (أفترض أنه يعمل كما خدمة Windows) القيام بعمل Thhibernate، قد ترغب في النظر في وجود جلسة تم إنشاؤها لكل طلب جديد من تطبيق سطح المكتب المستهلك، والتخلص منه عند صيانة هذا الطلب. لا تعرف بالضبط كيف يتم تشغيل خدمتك وأي آلية يستخدم تطبيق سطح المكتب للتحدث معه (النتيجة؟ الصابون القديم العادي؟) لا أستطيع أن أكون أكثر تحديدا.

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

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

نصائح أخرى

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

في تطبيق سطح المكتب، أوصي باستخدام جلسة لكل مقدم (أو نموذج إذا كنت تفضل). إلى اقتباس Ayende في له مجلة MSDN المادة:

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

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

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

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

الكثير من الإطار المنحلي وإطار كيان Microsoft ADO.NET متشابهان. إليك مقالة جيدة جدا حول كيفية التحكم في شريان الحياة في ObjectContext في ADO.NET EF.

http:/blogs.msdn.com/alexj/archive/2009/05/07/tip-18-how-to-decide-on-a-lifeTime-for-your-objectcontext.aspx.

يجب أن تنطبق على جلسات أحمق أيضا.

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