บทความนี้จะวิเคราะห์รายละเอียดการใช้งาน Hibernate เพื่อจัดการเซสชันและการดำเนินการแบบแบตช์ แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
ไฮเบอร์เนตจัดการเซสชัน
ไฮเบอร์เนตเองมีวิธีการจัดการอ็อบเจ็กต์เซสชันสามวิธี 1 วงจรชีวิตของอ็อบเจ็กต์เซสชันถูกผูกไว้กับเธรดในเครื่อง 2 วงจรชีวิตของอ็อบเจ็กต์เซสชันถูกผูกไว้กับธุรกรรม JTA 3 โปรแกรมตัวแทนของไฮเบอร์เนตจะจัดการวงจรชีวิตของอ็อบเจ็กต์เซสชัน
ในไฟล์การกำหนดค่า Hibernate แอตทริบิวต์ hibernate.current_session_context_class ใช้เพื่อระบุวิธีการจัดการเซสชัน ค่าเพิ่มเติม ได้แก่:
1 เธรด: วงจรชีวิตของอ็อบเจ็กต์เซสชันถูกผูกไว้กับเธรดในเครื่อง 2 jta*: วงจรชีวิตของอ็อบเจ็กต์เซสชันถูกผูกไว้กับธุรกรรม JTA 3 ที่ได้รับการจัดการ: โปรแกรมมอบหมายไฮเบอร์เนตเพื่อจัดการวงจรชีวิตของอ็อบเจ็กต์เซสชัน
วงจรชีวิตของวัตถุเซสชันถูกผูกไว้กับเธรดในเครื่อง:
หากค่าแอตทริบิวต์ hibernate.current_session_context_class ของไฟล์การกำหนดค่า Hibernate ถูกตั้งค่าเป็นเธรด Hibernate จะจัดการเซสชันในลักษณะที่เชื่อมโยงกับเธรดในเครื่อง
ไฮเบอร์เนตผูกเซสชันกับเธรดในเครื่องตามกฎต่อไปนี้:
เมื่อเธรด (thread) เรียกใช้เมธอด getCurrentSession() ของอ็อบเจ็กต์ SessionFactory เป็นครั้งแรก เมธอดนี้จะสร้างอ็อบเจ็กต์ Session (sessionA) ใหม่ ผูกอ็อบเจ็กต์กับ threadA และส่งคืนเซสชันเมื่อ threadA เรียกอ็อบเจ็กต์ SessionFactory อีกครั้ง เมื่อใช้เมธอด getCurrentSession() วิธีนี้จะส่งคืนออบเจ็กต์ sessionA เมื่อ threadA ส่งธุรกรรมที่เกี่ยวข้องกับออบเจ็กต์ sessionA Hibernate จะล้างข้อมูลโดยอัตโนมัติ แคชอ็อบเจ็กต์ sessionA จากนั้นคอมมิตธุรกรรมและปิดเซสชันตามต้องการ เมื่อ threadA ยกเลิกธุรกรรมที่เกี่ยวข้องกับวัตถุ sessionA วัตถุ sessionA จะถูกปิดโดยอัตโนมัติเช่นกัน หาก threadA เรียกใช้เมธอด getCurrentSession() ของวัตถุ SessionFactory อีกครั้ง วิธีการนี้จะสร้างวัตถุเซสชัน (sessionB) ใหม่และผูกวัตถุเข้ากับ threadA และส่งคืน sessionB
ประมวลผลข้อมูลเป็นชุด
การประมวลผลข้อมูลเป็นชุดหมายถึงการประมวลผลข้อมูลจำนวนมากในธุรกรรมเดียวและการดำเนินการเป็นชุดในกระบวนการเลเยอร์แอปพลิเคชัน วิธีการหลักมีดังนี้:
1 ผ่านเซสชั่น
② ผ่าน HQL
3 ผ่าน StatelessSession
④ ผ่าน JDBC API ---- แนะนำเพราะเร็วที่สุด
เซสชันดำเนินการแบบแบตช์:
เมธอด save() และ update() ของเซสชันจะจัดเก็บอ็อบเจ็กต์ที่ประมวลผลไว้ในแคชของตัวเอง หากใช้อ็อบเจ็กต์เซสชันเพื่อประมวลผลอ็อบเจ็กต์ถาวรจำนวนมาก อ็อบเจ็กต์ที่ได้รับการประมวลผลและจะไม่สามารถเข้าถึงได้อีกควรถูกล้างออกจากแคชในเวลาที่เหมาะสม วิธีการเฉพาะคือการเรียกเมธอด flush() ทันทีเพื่อรีเฟรชแคชหลังจากประมวลผลอ็อบเจ็กต์หรืออ็อบเจ็กต์ชุดเล็ก ๆ จากนั้นเรียกเมธอด clear() เพื่อแคชแคช
การดำเนินการประมวลผลผ่านเซสชันอยู่ภายใต้ข้อจำกัดต่อไปนี้:
จำนวนการประมวลผลแบตช์เดียวของ JDBC จำเป็นต้องตั้งค่าในไฟล์คอนฟิกูเรชัน Hibernate ควรตรวจสอบให้แน่ใจว่าจำนวนแบตช์ของคำสั่ง SQL ที่ส่งไปยังฐานข้อมูลในแต่ละครั้งสอดคล้องกับแอ็ตทริบิวต์ขนาดแบตช์
หากอ็อบเจ็กต์ใช้ตัวสร้างตัวระบุ "identity" ไฮเบอร์เนตจะไม่สามารถดำเนินการแทรกแบทช์ใน JDBC ได้
เมื่อดำเนินการแบบแบตช์ ขอแนะนำให้ปิดแคชระดับที่สองของ Hibernate
การสาธิตโค้ดสำหรับการแทรกข้อมูลเป็นชุด:
คัดลอกโค้ดและโค้ดดังนี้ ข่าวข่าว = null;
สำหรับ (int i = 0; i < 10,000; i ++) {
ข่าว = ข่าวใหม่ ();
news.setTitle("--" + i);
session.save(ข่าว);
ถ้า((i + 1) % 20 == 0) {
เซสชั่น.ฟลัช();
เซสชัน.ชัดเจน();
-
-
การอัปเดตเป็นชุด: เมื่อดำเนินการอัปเดตเป็นชุด ไม่แนะนำให้โหลดออบเจ็กต์ทั้งหมดลงในแคชเซสชันพร้อมกัน แล้วอัปเดตทีละรายการในแคช
ใช้ชุดผลลัพธ์แบบเลื่อนได้ org.hibernate.ScrollableResults วัตถุนี้ไม่มีวัตถุใด ๆ จริงๆ มีเพียงเคอร์เซอร์ที่ใช้เพื่อค้นหาบันทึกออนไลน์ เฉพาะเมื่อโปรแกรมเคลื่อนที่เพื่อเข้าถึงองค์ประกอบเฉพาะของวัตถุ ScrollableResults เท่านั้น โปรแกรมจะโหลดวัตถุที่เกี่ยวข้องในฐานข้อมูล
ออบเจ็กต์ org.hibernate.ScrollableResults จะถูกส่งกลับโดยวิธีการเลื่อนของ Query
การดำเนินการเป็นชุดผ่าน HQL:
หมายเหตุ: HQL รองรับเฉพาะคำสั่งแทรกในรูปแบบของ INSERT INTO...SELECT เท่านั้น แต่ไม่รองรับคำสั่งแทรกในรูปแบบของ INSERT INTO...VALUES ดังนั้นการดำเนินการแทรกแบทช์จึงไม่สามารถทำได้โดยใช้ HQL
การดำเนินการเป็นชุดผ่าน StatelessSession:
อย่างเป็นทางการ การใช้งาน StatelessSession จะคล้ายกับ Session เมื่อเปรียบเทียบกับ Session แล้ว StatelessSession จะมีความแตกต่างดังต่อไปนี้:
StatelessSession ไม่มีแคช และออบเจ็กต์ที่โหลด บันทึก หรืออัปเดตผ่าน StatelessSession จะอยู่ในสถานะอิสระ
StatelessSession จะไม่โต้ตอบกับแคชระดับที่สองของ Hibernate เมื่อเรียกใช้เมธอด save(), update() หรือ Delete() ของ StatelessSession เมธอดเหล่านี้จะรันคำสั่ง SQL ที่เกี่ยวข้องทันที แทนที่จะวางแผนเพื่อรันคำสั่ง SQL เพียงคำสั่งเดียว
StatelessSession จะไม่ทำการตรวจสอบสกปรก ดังนั้นหลังจากแก้ไขคุณสมบัติอ็อบเจ็กต์ลูกค้าแล้ว คุณต้องเรียกใช้เมธอด update() ของ StatelessSession เพื่ออัปเดตข้อมูลในฐานข้อมูล
StatelessSession จะไม่ดำเนินการเรียงซ้อนกับออบเจ็กต์ที่เกี่ยวข้อง ออบเจ็กต์ลูกค้าที่มี OID 1 ถูกโหลดสองครั้งผ่านออบเจ็กต์ StatelessSession เดียวกัน
การดำเนินการที่ดำเนินการโดย StatelessSession สามารถบันทึกได้โดย Interceptor Interceptor แต่จะถูกละเลยโดยระบบประมวลผลเหตุการณ์ของ Hibernate
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน