ทำความเข้าใจเกี่ยวกับ ISession.Flush ใน NHibernate: เมื่อไหร่และทำไมถึงต้องใช้

การทำงานกับ NHibernate อาจรู้สึกหนักใจในบางครั้ง โดยเฉพาะอย่างยิ่งกับฟังก์ชันเช่น ISession.Flush นักพัฒนาหลายคนมีปัญหาในการทำความเข้าใจการใช้งานและการใช้ฟังก์ชันนี้อย่างมีประสิทธิภาพ ในคู่มือนี้ เราจะสรุปสิ่งที่ session.Flush คือเมื่อไหร่ที่ควรใช้และทำไมมันจึงสำคัญในการทำธุรกรรมกับฐานข้อมูลของคุณ

ความท้าทายหลัก: การจัดการเซสชั่น

ความสับสนมักเกิดขึ้นเกี่ยวกับความสัมพันธ์ระหว่างสามการดำเนินการสำคัญใน NHibernate: Flush, Commit, และ Close ด้านล่างนี้คือภาพรวมสั้น ๆ:

  • Flush: อัปเดตฐานข้อมูลด้วยการเปลี่ยนแปลงที่เกิดขึ้นในหน่วยความจำ
  • Commit: เสร็จสิ้นธุรกรรม โดยทำให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดได้รับการยืนยันหรือถูกย้อนกลับเมื่อมีข้อผิดพลาด
  • Close: สิ้นสุดเซสชั่นและปล่อยการเชื่อมต่อใด ๆ

การทำความเข้าใจว่าเมื่อใดควรใช้ Flush ร่วมกับ Commit ถือเป็นสิ่งสำคัญสำหรับการจัดการข้อมูลอย่างมีประสิทธิภาพ

เมื่อไหร่ที่ควรใช้ ISession.Flush

นี่คือแนวทางที่ชัดเจน เพื่อช่วยให้คุณตัดสินใจเมื่อไหร่ที่จะใช้ Flush อย่างมีประสิทธิภาพ:

  1. ใช้ธุรกรรมเสมอ: เริ่มต้นด้วยการห่อหุ้มการทำงานกับฐานข้อมูลในธุรกรรม นี่เป็นกลไกการย้อนกลับที่ง่ายสำหรับการจัดการข้อผิดพลาด
  2. หลีกเลี่ยงการใช้ Close() โดยตรง: แทนที่นั้นให้เลือกใช้คำสั่ง using ที่จัดการวงจรชีวิตของ ISession โดยอัตโนมัติ ซึ่งช่วยป้องกันการรั่วไหลของทรัพยากรและเพิ่มความสามารถในการอ่านของโค้ด

พฤติกรรมการฟลัชเริ่มต้นของ NHibernate

ตาม เอกสาร NHibernate, การฟลัชของ ISession จะเกิดขึ้นโดยอัตโนมัติในหลายสถานการณ์:

  • ในระหว่างการเรียกใช้ฟังก์ชัน Find() หรือ Enumerable() บางครั้ง
  • เมื่อเรียก NHibernate.ITransaction.Commit(); จะฟลัชและทำธุรกรรมในครั้งเดียว
  • โดยชัดเจนโดยการเรียก ISession.Flush()

ลำดับการดำเนินการฟลัช

เมื่อมีการฟลัชเกิดขึ้น NHibernate จะดำเนิน SQL คำสั่งตามลำดับดังต่อไปนี้:

  1. การแทรกสำหรับทุกเอนทิตี (ตามลำดับที่ถูกบันทึก)
  2. การอัปเดตสำหรับทุกเอนทิตี
  3. การลบสำหรับคอลเลกชัน
  4. การอัปเดตหรือลงทะเบียนสำหรับองค์ประกอบในคอลเลกชัน
  5. สุดท้ายคือการลบเอนทิตี (ตามลำดับที่สัมพันธ์กับการเรียกการลบของพวกเขา)

ข้อพิจารณาที่สำคัญ

  • การฟลัชโดยนัยเทียบกับการฟลัชอย่างชัดเจน: หากคุณไม่เรียก Flush() โดยชัดเจน จะไม่มีการรับประกันเกี่ยวกับเวลาในการดำเนินการเซสชั่น โดยแค่ลำดับ
  • โหมดฟลัช: คุณสามารถกำหนด FlushMode สำหรับเซสชั่นของคุณได้สามโหมด: ฟลัชเฉพาะเมื่อมีการคอมมิต, ฟลัชโดยอัตโนมัติ, หรือไม่ฟลัชเว้นแต่จะมีการเรียกเฉพาะ นี่มีความสำคัญเป็นพิเศษสำหรับธุรกรรมที่ใช้เวลานาน

ช่วงการฟลัช, การคอมมิต, และการปิด

การสิ้นสุดเซสชั่นเกี่ยวข้องกับช่วงที่แตกต่างกันเหล่านี้ ที่เน้นในเอกสาร:

  1. ฟลัชเซสชั่น: เรียก Flush() เพื่อให้แน่ใจว่าการเปลี่ยนแปลงซิงค์กับฐานข้อมูลเมื่อไม่ได้ใช้ API ITransaction
  2. คอมมิตธุรกรรม: หากใช้ API ITransaction นี่จะถูกจัดการโดยอัตโนมัติ มิฉะนั้น คุณต้องทำโดยมือ
  3. ปิดเซสชั่น: ปิดเซสชั่นของคุณเสมอเพื่อปล่อยการเชื่อมต่ออย่างถูกต้อง

ตัวอย่างโค้ดการจัดการ

นี่คือวิธีการจัดการกับช่วงเหล่านี้ใน 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 ง่ายและมีประสิทธิภาพมากขึ้น

โดยการปฏิบัติตามคำแนะนำในบทความนี้ คุณจะสามารถจัดการการทำงานกับฐานข้อมูลของคุณได้อย่างมีประสิทธิภาพ ทำให้แน่ใจว่ามีความถูกต้องของข้อมูลและประสิทธิภาพของเซสชั่นอยู่ในระดับที่ดีที่สุดเสมอ