ทำความเข้าใจเกี่ยวกับ ISession.Flush
ใน NHibernate: เมื่อไหร่และทำไมถึงต้องใช้
การทำงานกับ NHibernate อาจรู้สึกหนักใจในบางครั้ง โดยเฉพาะอย่างยิ่งกับฟังก์ชันเช่น ISession.Flush
นักพัฒนาหลายคนมีปัญหาในการทำความเข้าใจการใช้งานและการใช้ฟังก์ชันนี้อย่างมีประสิทธิภาพ ในคู่มือนี้ เราจะสรุปสิ่งที่ session.Flush
คือเมื่อไหร่ที่ควรใช้และทำไมมันจึงสำคัญในการทำธุรกรรมกับฐานข้อมูลของคุณ
ความท้าทายหลัก: การจัดการเซสชั่น
ความสับสนมักเกิดขึ้นเกี่ยวกับความสัมพันธ์ระหว่างสามการดำเนินการสำคัญใน NHibernate: Flush
, Commit
, และ Close
ด้านล่างนี้คือภาพรวมสั้น ๆ:
- Flush: อัปเดตฐานข้อมูลด้วยการเปลี่ยนแปลงที่เกิดขึ้นในหน่วยความจำ
- Commit: เสร็จสิ้นธุรกรรม โดยทำให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดได้รับการยืนยันหรือถูกย้อนกลับเมื่อมีข้อผิดพลาด
- Close: สิ้นสุดเซสชั่นและปล่อยการเชื่อมต่อใด ๆ
การทำความเข้าใจว่าเมื่อใดควรใช้ Flush
ร่วมกับ Commit
ถือเป็นสิ่งสำคัญสำหรับการจัดการข้อมูลอย่างมีประสิทธิภาพ
เมื่อไหร่ที่ควรใช้ ISession.Flush
นี่คือแนวทางที่ชัดเจน เพื่อช่วยให้คุณตัดสินใจเมื่อไหร่ที่จะใช้ Flush
อย่างมีประสิทธิภาพ:
- ใช้ธุรกรรมเสมอ: เริ่มต้นด้วยการห่อหุ้มการทำงานกับฐานข้อมูลในธุรกรรม นี่เป็นกลไกการย้อนกลับที่ง่ายสำหรับการจัดการข้อผิดพลาด
- หลีกเลี่ยงการใช้
Close()
โดยตรง: แทนที่นั้นให้เลือกใช้คำสั่งusing
ที่จัดการวงจรชีวิตของISession
โดยอัตโนมัติ ซึ่งช่วยป้องกันการรั่วไหลของทรัพยากรและเพิ่มความสามารถในการอ่านของโค้ด
พฤติกรรมการฟลัชเริ่มต้นของ NHibernate
ตาม เอกสาร NHibernate, การฟลัชของ ISession
จะเกิดขึ้นโดยอัตโนมัติในหลายสถานการณ์:
- ในระหว่างการเรียกใช้ฟังก์ชัน
Find()
หรือEnumerable()
บางครั้ง - เมื่อเรียก
NHibernate.ITransaction.Commit()
; จะฟลัชและทำธุรกรรมในครั้งเดียว - โดยชัดเจนโดยการเรียก
ISession.Flush()
ลำดับการดำเนินการฟลัช
เมื่อมีการฟลัชเกิดขึ้น NHibernate จะดำเนิน SQL คำสั่งตามลำดับดังต่อไปนี้:
- การแทรกสำหรับทุกเอนทิตี (ตามลำดับที่ถูกบันทึก)
- การอัปเดตสำหรับทุกเอนทิตี
- การลบสำหรับคอลเลกชัน
- การอัปเดตหรือลงทะเบียนสำหรับองค์ประกอบในคอลเลกชัน
- สุดท้ายคือการลบเอนทิตี (ตามลำดับที่สัมพันธ์กับการเรียกการลบของพวกเขา)
ข้อพิจารณาที่สำคัญ
- การฟลัชโดยนัยเทียบกับการฟลัชอย่างชัดเจน: หากคุณไม่เรียก
Flush()
โดยชัดเจน จะไม่มีการรับประกันเกี่ยวกับเวลาในการดำเนินการเซสชั่น โดยแค่ลำดับ - โหมดฟลัช: คุณสามารถกำหนด
FlushMode
สำหรับเซสชั่นของคุณได้สามโหมด: ฟลัชเฉพาะเมื่อมีการคอมมิต, ฟลัชโดยอัตโนมัติ, หรือไม่ฟลัชเว้นแต่จะมีการเรียกเฉพาะ นี่มีความสำคัญเป็นพิเศษสำหรับธุรกรรมที่ใช้เวลานาน
ช่วงการฟลัช, การคอมมิต, และการปิด
การสิ้นสุดเซสชั่นเกี่ยวข้องกับช่วงที่แตกต่างกันเหล่านี้ ที่เน้นในเอกสาร:
- ฟลัชเซสชั่น: เรียก
Flush()
เพื่อให้แน่ใจว่าการเปลี่ยนแปลงซิงค์กับฐานข้อมูลเมื่อไม่ได้ใช้ APIITransaction
- คอมมิตธุรกรรม: หากใช้ API
ITransaction
นี่จะถูกจัดการโดยอัตโนมัติ มิฉะนั้น คุณต้องทำโดยมือ - ปิดเซสชั่น: ปิดเซสชั่นของคุณเสมอเพื่อปล่อยการเชื่อมต่ออย่างถูกต้อง
ตัวอย่างโค้ดการจัดการ
นี่คือวิธีการจัดการกับช่วงเหล่านี้ใน NHibernate:
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
// การทำงานกับฐานข้อมูลของคุณที่นี่
session.Flush(); // เพื่อให้แน่ใจว่าการเปลี่ยนแปลงถูกนำไปใช้
transaction.Commit(); // คอมมิตธุรกรรม
}
}
หากคุณจัดการธุรกรรม ADO.NET โดยตรง:
session.Flush(); // ฟลัชโดยชัดเจน
currentTransaction.Commit(); // คอมมิตธุรกรรม ADO.NET
สรุป: เชี่ยวชาญในการฟลัช NHibernate
แม้ว่า ISession.Flush
อาจดูน่ากลัว แต่การทำความเข้าใจความสัมพันธ์กับการจัดการธุรกรรมเป็นสิ่งสำคัญ การปฏิบัติตามแนวทางที่ดีที่สุด—เช่น การใช้ธุรกรรมเสมอ, การจัดการการปิดเซสชั่นอย่างเหมาะสม และการรู้ว่าเมื่อใดควรฟลัช—จะทำให้ประสบการณ์ของคุณกับ NHibernate ง่ายและมีประสิทธิภาพมากขึ้น
โดยการปฏิบัติตามคำแนะนำในบทความนี้ คุณจะสามารถจัดการการทำงานกับฐานข้อมูลของคุณได้อย่างมีประสิทธิภาพ ทำให้แน่ใจว่ามีความถูกต้องของข้อมูลและประสิทธิภาพของเซสชั่นอยู่ในระดับที่ดีที่สุดเสมอ