บทความนี้สรุปสี่วิธีในการแก้ปัญหาการโหลด Hibernate ขี้เกียจในกระบวนการเรียนรู้ไฮเบอร์เนต
การโหลดขี้เกียจที่เรียกว่ากำลังโหลดล่าช้าการโหลดล่าช้า
เมื่อใดควรใช้การโหลดขี้เกียจ? ฉันสามารถตอบได้ว่าเมื่อคุณต้องการใช้การโหลดขี้เกียจใช้การโหลดขี้เกียจ
สำหรับสาเหตุที่เราต้องใช้การโหลดขี้เกียจเป็นที่ชัดเจนว่าเมื่อปริมาณข้อมูลที่เราต้องการเข้าถึงมีขนาดใหญ่เกินไปมันไม่เหมาะที่จะใช้แคชเนื่องจากความจุหน่วยความจำมี จำกัด เพื่อลดปริมาณของการเกิดขึ้นพร้อมกันและลดการใช้ทรัพยากรของระบบเราปล่อยให้ข้อมูลถูกโหลดเมื่อจำเป็นจากนั้นเราใช้การโหลดขี้เกียจ
ตัวอย่างเช่นมีวัตถุที่เป็นพนักงานและวัตถุอื่นที่เป็นแผนก เห็นได้ชัดว่าสำหรับพนักงานมันเป็นความสัมพันธ์แบบหลายต่อหนึ่งเมื่อเทียบกับแผนกและสำหรับแผนกมันเป็นความสัมพันธ์แบบหนึ่งต่อหลายคนเมื่อเทียบกับพนักงาน เมื่อเราสอบถามวัตถุของพนักงานหากเราต้องการสอบถามแผนกที่เกี่ยวข้องผ่านแผนกอสังหาริมทรัพย์ของวัตถุพนักงานจะมีการโยนข้อยกเว้น นี่เป็นเพราะการมีอยู่ของการโหลดขี้เกียจ หลังจากปิดเซสชันแล้วไฮเบอร์เนตจะออกคำขออีกครั้งไปยังฐานข้อมูลและมีข้อยกเว้นถูกโยนลงไป
ต่อไปนี้เป็นสี่วิธีในการแก้ปัญหานี้:
1. การเริ่มต้นอย่างชัดเจน (ภายในวิธีการสืบค้น)
เมื่อถามว่าพนักงานของแผนกใดเป็นของคุณจะต้องดำเนินการตามคำถามก่อนแผนก
ใช้คำสั่ง
hibernate.initialize (แผนก. class);
2. แก้ไขไฟล์ความสัมพันธ์ของวัตถุและเขียนใหม่ Lazy Lazy = False นั่นคือปิดการโหลดขี้เกียจ
สองวิธีข้างต้นสามารถแก้ปัญหาได้ แต่ข้อเสียคือไม่ว่าวัตถุจะถูกใช้ในภายหลัง Hibernate จะออกคำสั่ง SQL ไปยังฐานข้อมูลเพื่อขอข้อมูลหรือไม่ทำให้เกิดการสูญเสียประสิทธิภาพที่ไม่จำเป็น
3. ใช้ตัวกรอง (เว็บโครงการ)
①วิธีที่จะได้รับเซสชันจะต้องใช้ getCurrentSession
②วิธีการปิดระบบ
โมฆะสาธารณะ Dofilter (คำขอ ServletRequest, การตอบสนอง servletResponse, filterchain arg2) พ่น IOException, servletexception {// todo วิธีการที่สร้างขึ้นอัตโนมัติเซสชันเซสชันเซสชัน = null; ธุรกรรม tx = null; ลอง {session = hibernateutil.getCurrentsession (); tx = session.beginTransaction (); arg2.dofilter (คำขอ, การตอบกลับ); // คำขอกำลังดำเนินการอย่างต่อเนื่อง tx.commit (); } catch (exception e) {// todo: จัดการข้อยกเว้นถ้า (tx! = null) {tx.rollback (); }} ในที่สุด {// วิธีการปิดพิเศษ hibernateutil.closecurrentsession (); -4. ในเฟรมเวิร์ก SSH ให้ใช้ OpenSessionView ที่จัดทำโดยฤดูใบไม้ผลิ
หลักการคล้ายกับการใช้ตัวกรองในวิธีที่สามยกเว้นว่าตัวกรองนี้มีให้ในฤดูใบไม้ผลิ เมื่อใช้งานคุณจะต้องกำหนดค่าไว้ในไฟล์ web.xml ดังนี้:
<!-ใช้สปริงเพื่อแก้ปัญหาการโหลดขี้เกียจ-> <filter> <silter-name> OpenSessionInviewFilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.opensessioninview <url-pattern>/*</url-pattern> </filter-mapping>
วิธีการใน 3 และ 4 ยังสามารถแก้ปัญหาการโหลดขี้เกียจและวิธีที่สี่ก็ใช้บ่อยขึ้นในปัจจุบัน อย่างไรก็ตามวิธีการทั้งสองนี้ก็มีข้อเสียเช่นกัน ข้อเสียคือพวกเขายืดเวลาเมื่อเซสชันถูกปิดและวงจรชีวิตของเซสชั่นจะนานขึ้น ก่อนที่จะใช้วิธีนี้เซสชันจะถูกปิดหลังจากสอบถามข้อมูล ตอนนี้เซสชันจะปิดเมื่อสิ้นสุดคำขอเว็บ
สรุป
ข้างต้นเป็นเรื่องเกี่ยวกับสี่วิธีในการแก้ปัญหาการโหลดไฮเบอร์เนตขี้เกียจ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!