إدارة جلسة NHiernate في Asp.Net
الكاتب:Eve Cole
وقت التحديث:2009-06-30 16:46:38
يبدو أن الجلسة في NHibernate تعادل اتصال قاعدة البيانات في فهمي. نظرًا لأنه يحتوي أيضًا على طرق فتح/إغلاق، لم أدرس الكود المصدري لـ NHibernate، وأتساءل عما إذا كان هذا الفهم خاطئًا؟ لقد بحثت كثيرًا عن إدارة الجلسة على الإنترنت. معظمها OpenSession() عندما أحتاج إلى عمليات قاعدة البيانات، وCloseSession() بعد العملية، وهذا مشابه قليلاً لما بدأنا في تعلم ADO.NET لأول مرة. ) كائن الاتصال، ثم إغلاق () بعد معالجة البيانات ولكن هذا يجلب عيبًا، لأن التبديل المتكرر للاتصال يستهلك موارد النظام. أتذكر عندما كنت أقوم بإنشاء واجهة إدخال بيانات من قبل، لأن واجهة الإدخال هذه تحتوي على العديد من عناصر البيانات، وكان العديد من قوائم DropDownLists بحاجة إلى قراءة البيانات في قاعدة البيانات وربطها.
بهذه الطريقة، في Page_Load للصفحة، يجب استدعاء أساليب الكائنات المقابلة واحدًا تلو الآخر لاسترداد البيانات المرتبطة بـ DropDownList من قاعدة البيانات، نظرًا لأن أساليب هذه الكائنات الخاصة بنا تستخدم اتصالات مستقلة، فإن جميعها لها خصائصها الخاصة فتح وإغلاق الاتصال الخاص. ولذلك، يستغرق فتح هذه الصفحة وقتًا طويلاً، وهو بطيء نسبيًا. لاحقًا، قمنا بمعالجة البيانات التي يلزم ربطها بقائمة DropDownList في DataSet، وربطنا DataTable في DataSet بقائمة DropDownList. بهذه الطريقة، يلزم فتح/إغلاق اتصال واحد فقط وتكون الصفحة أسرع بكثير.
لذلك، أشعر أن طريقة إدارة الجلسة المذكورة أعلاه ليست مناسبة جدًا.
لاحقًا، نظرت إلى إدارة جلساته في مشروع Cuyahoga مفتوح المصدر، واستخدم نموذج "الجلسة لكل طلب".
المفهوم الحرفي هو أنه يقوم بإنشاء جلسة لكل طلب حتى يتم تدمير الطلب، ثم يتم إغلاق الجلسة.
يختلف أسلوب Cuyahoga قليلاً عن الجلسة لكل طلب حيث أنه يقوم بإنشاء كائن CoreRepository لكل طلب. CoreRepository هو فئة خدمات معالجة البيانات التي يتطلبها النظام.
ما فعله هو أولاً إنشاء HttpModule (NHSessionModule) لإنشاء كائنات CoreRepository وتدمير كائنات CoreRepository، كما يلي:
الفراغ الخاص context_BeginRequest (مرسل الكائن، EventArgs e)
{
// أنشئ مستودعًا للكائنات الأساسية وأضفه إلى HttpContext الحالي.
CoreRepository cr = new CoreRepository(true);
HttpContext.Current.Items.Add("CoreRepository"، cr);
}
الفراغ الخاص context_EndRequest (مرسل الكائن، EventArgs e)
{
// أغلق جلسة NHibernate.
إذا (HttpContext.Current.Items["CoreRepository"] != null)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
بهذه الطريقة، سيتم إنشاء كائن CoreRepository تلقائيًا في كل مرة يتم فيها تقديم طلب. عند اكتمال الطلب، يمكن استخدام CloseSession() للحصول على كائن CoreRepository من خلال HttpContext.Current.Items["CoreRepository"] في البرنامج.
بهذه الطريقة، تتم إدارة الجلسة في NHibernate بشكل مقنع، ويتم تحقيق نموذج "الجلسة لكل طلب".
شرح تفصيلي: تهيئة جلسة Nhibernate من خلال تطبيق IHttpModule
بالمقارنة مع الطريقة المذكورة أعلاه، والتي تتطلب إنشاء جلسة لكل عملية، يجب أن تعمل هذه الطريقة على تحسين الأداء والسرعة كثيرًا.
ثم فكرت أن كل طلب ينشئ جلسة. هل يمكننا أيضًا إنشاء تجمع جلسات مثل تجمع الاتصال؟
بهذه الطريقة، بدلاً من إنشاء جلسة مباشرة في كل مرة يتم فيها تقديم طلب، يتم أخذ الجلسة التي تم إنشاؤها بالفعل من مجمع الجلسات الخاص بنا، أليس هذا أكثر كفاءة؟ !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html