การจัดการเซสชัน NHiernate ใน Asp.Net
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-06-30 16:46:38
เซสชันใน NHibernate ดูเหมือนจะเทียบเท่ากับการเชื่อมต่อฐานข้อมูลในความเข้าใจของฉัน เนื่องจากมีวิธีเปิด/ปิดด้วย ฉันจึงไม่ได้ศึกษาซอร์สโค้ดของ NHibernate ฉันสงสัยว่าความเข้าใจนี้ผิดหรือไม่ ฉันค้นหามากมายเกี่ยวกับการจัดการเซสชันบนอินเทอร์เน็ต ส่วนใหญ่เป็น OpenSession() เมื่อฉันต้องการการดำเนินการกับฐานข้อมูล และ CloseSession() หลังจากการดำเนินการ สิ่งนี้คล้ายกับเมื่อเราเริ่มเรียนรู้ ADO.NET เป็นครั้งแรก ) อ็อบเจ็กต์ Connection จากนั้นปิด () หลังจากประมวลผลข้อมูลแล้ว แต่สิ่งนี้นำมาซึ่งข้อเสียเปรียบ เนื่องจากการสลับการเชื่อมต่อบ่อยครั้งใช้ทรัพยากรระบบ ฉันจำได้ว่าเมื่อก่อนฉันสร้างอินเทอร์เฟซการป้อนข้อมูล เนื่องจากอินเทอร์เฟซนี้มีองค์ประกอบข้อมูลมากมาย และ DropDownList จำนวนมากจำเป็นต้องอ่านข้อมูลในฐานข้อมูลและผูกมัน
ด้วยวิธีนี้ ใน Page_Load ของเพจ จำเป็นต้องเรียกเมธอดของออบเจ็กต์ที่เกี่ยวข้องทีละรายการเพื่อดึงข้อมูล DropDownList ที่เชื่อมโยงจากฐานข้อมูล เนื่องจากวิธีการของออบเจ็กต์เหล่านี้ใช้การเชื่อมต่อที่เป็นอิสระ พวกเขาทั้งหมดจึงมี เป็นเจ้าของการเปิดและปิดการเชื่อมต่อ ดังนั้นจึงใช้เวลานานในการเปิดหน้านี้ซึ่งค่อนข้างช้า ต่อมา เราประมวลผลข้อมูลที่จำเป็นต้องผูกกับ DropDownList ลงในชุดข้อมูล และผูก DataTable ในชุดข้อมูลเข้ากับ DropDownList ด้วยวิธีนี้ จำเป็นต้องมีการเปิด/ปิดการเชื่อมต่อเพียงครั้งเดียวเท่านั้น หน้าเพจจะเร็วขึ้นมาก
ดังนั้นผมจึงรู้สึกว่าวิธีการจัดการ Session ข้างต้นไม่เหมาะสมนัก
ต่อมา ฉันดูการจัดการเซสชันของเขาในโปรเจ็กต์โอเพ่นซอร์ส Cuyahoga และเขาใช้โมเดล "เซสชันต่อคำขอ"
ความเข้าใจที่แท้จริงคือจะสร้างเซสชันสำหรับแต่ละคำขอจนกว่าคำขอจะถูกทำลาย จากนั้นเซสชันจะถูกปิด
แนวทางของ Cuyahoga แตกต่างเล็กน้อยจากเซสชันต่อคำขอตรงที่เขาสร้างวัตถุ CoreRepository สำหรับแต่ละคำขอ CoreRepository เป็นคลาสของบริการประมวลผลข้อมูลที่ระบบต้องการ
สิ่งที่เขาทำคือสร้าง HttpModule (NHSessionModule) ก่อนเพื่อสร้างอ็อบเจ็กต์ CoreRepository และทำลายอ็อบเจ็กต์ CoreRepository ดังนี้
โมฆะส่วนตัว Context_BeginRequest (ผู้ส่งวัตถุ EventArgs e)
-
// สร้างที่เก็บสำหรับวัตถุ Core และเพิ่มลงใน HttpContext ปัจจุบัน
CoreRepository cr = CoreRepository ใหม่ (จริง);
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 ไปใช้
เมื่อเทียบกับวิธีการข้างต้นที่ต้องสร้าง Session ขึ้นมาสำหรับทุกการดำเนินการ วิธีนี้น่าจะปรับปรุงประสิทธิภาพและความเร็วได้มาก
จากนั้นฉันก็คิดว่าทุกคำขอจะสร้างเซสชัน เราสามารถสร้างเซสชันพูลเช่นพูลการเชื่อมต่อได้หรือไม่
ด้วยวิธีนี้ แทนที่จะสร้างเซสชันโดยตรงทุกครั้งที่มีการร้องขอ เซสชันที่สร้างไว้แล้วจะถูกนำมาจากเซสชันพูลของเรา วิธีนี้มีประสิทธิภาพมากกว่าหรือไม่ -
http://maplye.cnblogs.com/archive/2006/06/26/435683.html