ทุกคนสามารถอธิบายด้วยคำพูดง่ายๆว่าการแคชระดับแรกและระดับที่สองในไฮเบอร์เนตคืออะไร?
ทุกคนสามารถอธิบายด้วยคำพูดง่ายๆว่าการแคชระดับแรกและระดับที่สองในไฮเบอร์เนตคืออะไร?
คำตอบ:
1.1) แคชระดับแรก
แคชระดับแรกเชื่อมโยงกับวัตถุเซสชันเสมอ ไฮเบอร์เนตใช้แคชนี้เป็นค่าเริ่มต้น ที่นี่จะประมวลผลหนึ่งธุรกรรมหลังจากอีกธุรกรรมหนึ่งหมายความว่าจะไม่ดำเนินการหนึ่งธุรกรรมหลายครั้ง ส่วนใหญ่จะลดจำนวนแบบสอบถาม SQL ที่ต้องการสร้างภายในการทำธุรกรรมที่กำหนด นั่นคือแทนที่จะอัปเดตหลังจากการปรับเปลี่ยนทุกครั้งที่ทำในธุรกรรมนั้นเป็นการอัพเดตธุรกรรมเฉพาะเมื่อสิ้นสุดธุรกรรม
1.2) แคชระดับที่สอง
แคชระดับที่สองจะเชื่อมโยงกับวัตถุ Session Factoryเสมอ ในขณะที่ทำธุรกรรมในระหว่างนั้นโหลดวัตถุที่ระดับโรงงานเซสชันเพื่อให้วัตถุเหล่านั้นจะพร้อมใช้งานสำหรับแอปพลิเคชันทั้งหมดไม่ผูกกับผู้ใช้คนเดียว เนื่องจากวัตถุถูกโหลดในแคชอยู่แล้วเมื่อใดก็ตามที่วัตถุถูกส่งคืนโดยแบบสอบถามในเวลานั้นไม่จำเป็นต้องไปทำธุรกรรมฐานข้อมูล ด้วยวิธีนี้แคชระดับที่สองจะทำงาน ที่นี่เราสามารถใช้แคชระดับแบบสอบถามได้เช่นกัน
อ้างจาก: http://javabeat.net/introduction-to-hibernate-caching/
มีคำอธิบายที่ดีเกี่ยวกับการแคชระดับแรกในบล็อกStreamline Logic
โดยทั่วไปการแคชระดับแรกจะเกิดขึ้นในแต่ละเซสชันซึ่งการแคชระดับที่สองสามารถแชร์ข้ามหลายเซสชันได้
ต่อไปนี้เป็นคำอธิบายพื้นฐานของแคชไฮเบอร์เนต ...
แคชระดับแรกเกี่ยวข้องกับวัตถุ“ เซสชัน” ขอบเขตของวัตถุแคชเป็นของเซสชั่น เมื่อเซสชั่นถูกปิดวัตถุที่แคชจะหายไปตลอดกาล แคชระดับแรกเปิดใช้งานโดยค่าเริ่มต้นและคุณไม่สามารถปิดใช้งานได้ เมื่อเราสอบถามเอนทิตีครั้งแรกมันจะถูกดึงจากฐานข้อมูลและเก็บไว้ในแคชระดับแรกที่เกี่ยวข้องกับการจำศีลเซสชั่น ถ้าเราสอบถามวัตถุเดียวกันอีกครั้งด้วยวัตถุเซสชันเดียวกันมันจะถูกโหลดจากแคชและจะไม่มีการดำเนินการสืบค้น SQL เอนทิตีที่โหลดสามารถลบออกจากเซสชันโดยใช้evict()
วิธีการ การโหลดครั้งต่อไปของเอนทิตีนี้จะทำการเรียกฐานข้อมูลอีกครั้งหากถูกลบโดยใช้evict()
วิธีการ แคชเซสชันทั้งหมดสามารถลบได้โดยใช้clear()
วิธีการ มันจะลบเอนทิตีทั้งหมดที่เก็บไว้ในแคช
แคชระดับที่สองนั้นแตกต่างจากแคชระดับแรกที่พร้อมใช้งานทั่วโลกในขอบเขตโรงงานเซสชัน แคชระดับที่สองถูกสร้างขึ้นในขอบเขตโรงงานเซสชันและพร้อมที่จะใช้ในเซสชันทั้งหมดที่สร้างขึ้นโดยใช้โรงงานเซสชันนั้น นอกจากนี้ยังหมายความว่าเมื่อโรงงานเซสชันถูกปิดแคชทั้งหมดที่เกี่ยวข้องกับมันจะตายและผู้จัดการแคชก็ปิดตัวลงเช่นกัน เมื่อใดก็ตามที่เซสชันไฮเบอร์เนตพยายามโหลดเอนทิตีสถานที่แรกที่ค้นหาสำเนาแคชของเอนทิตีในแคชระดับแรก (เกี่ยวข้องกับเซสชันไฮเบอร์เนตโดยเฉพาะ) หากสำเนาแคชของเอนทิตีมีอยู่ในแคชระดับแรกจะถูกส่งคืนเนื่องจากผลลัพธ์ของวิธีโหลด หากไม่มีเอนทิตีแคชในแคชระดับแรกแคชระดับที่สองจะค้นหาเอนทิตีแคช หากแคชระดับที่สองมีเอนทิตีแคชจะถูกส่งคืนเนื่องจากวิธีการโหลด แต่, ก่อนที่จะส่งคืนเอนทิตีมันจะถูกเก็บไว้ในแคชระดับแรกเช่นกันเพื่อให้การเรียกใช้วิธีโหลดครั้งถัดไปสำหรับเอนทิตีจะส่งคืนเอนทิตีจากแคชระดับแรกเองและไม่จำเป็นต้องไปที่แคชระดับที่สองอีก หากไม่พบเอนทิตีในแคชระดับแรกและแคชระดับที่สองจะมีการดำเนินการค้นหาฐานข้อมูลและเก็บเอนทิตีในระดับแคชทั้งสองก่อนกลับมาเป็นการตอบสนองของload()
วิธี.
นี่เป็นคำถามที่พบบ่อยมากดังนั้นคำตอบนี้เป็นไปตามบทความที่ฉันเขียนในบล็อกของฉัน
Hibernate พยายามที่จะเลื่อนบริบทการคงอยู่ไปจนถึงวินาทีสุดท้ายที่เป็นไปได้ อย่างที่ฉันอธิบายไว้ในบทความนี้นี้กลยุทธ์นี้เป็นที่รู้จักกันในชื่อการทำธุรกรรม
การเขียนที่เกี่ยวข้องกับการไฮเบอร์เนตล้างมากกว่าธุรกรรมทางตรรกะหรือทางกายภาพใด ๆ ในระหว่างการทำธุรกรรมการล้างข้อมูลอาจเกิดขึ้นหลายครั้ง
การเปลี่ยนแปลงที่ถูกล้างข้อมูลจะมองเห็นได้เฉพาะสำหรับธุรกรรมฐานข้อมูลปัจจุบัน จนกว่าจะมีการทำธุรกรรมปัจจุบันจะไม่มีการเปลี่ยนแปลงใด ๆ เกิดขึ้นพร้อมกันในการทำธุรกรรมอื่น ๆ
เนื่องจากแคชระดับแรก Hibernate สามารถทำการเพิ่มประสิทธิภาพหลายอย่าง:
โซลูชันแคชที่เหมาะสมจะต้องครอบคลุมช่วงไฮเบอร์เนตหลายครั้งและนั่นคือเหตุผลที่ไฮเบอร์เนตรองรับแคชระดับที่สองเพิ่มเติมเช่นกัน
แคชระดับที่สองถูกผูกไว้กับวงจรชีวิตของ SessionFactory ดังนั้นมันจะถูกทำลายก็ต่อเมื่อSessionFactory
ถูกปิด (โดยทั่วไปคือเมื่อแอปพลิเคชันปิด) แคชระดับที่สองนั้นมุ่งเน้นที่เอนทิตีเป็นหลักแม้ว่าจะสนับสนุนโซลูชันการแคชแบบสอบถามที่เป็นตัวเลือกเช่นกัน
โดยค่าเริ่มต้น NHibernate ใช้การแคชระดับแรกซึ่งเป็นไปตามวัตถุเซสชัน แต่ถ้าคุณกำลังทำงานในสภาพแวดล้อมที่มีหลายเซิร์ฟเวอร์แคชระดับแรกอาจไม่สามารถปรับขนาดได้มากพร้อมกับปัญหาด้านประสิทธิภาพบางอย่าง มันเกิดขึ้นเนื่องจากความจริงที่ว่ามันต้องเดินทางบ่อยครั้งไปยังฐานข้อมูลเนื่องจากมีการเผยแพร่ข้อมูลผ่านเซิร์ฟเวอร์หลายเครื่อง กล่าวอีกนัยหนึ่ง NHibernate ให้แคช L1 ขั้นพื้นฐานที่ไม่ซับซ้อนดังนั้นไม่อยู่ในกล่อง อย่างไรก็ตามมันไม่ได้มีคุณสมบัติที่โซลูชั่นแคชจะต้องมีผลกระทบอย่างมากต่อประสิทธิภาพการทำงานของแอปพลิเคชัน
ดังนั้นคำถามของปัญหาเหล่านี้คือการใช้แคช L2 ซึ่งเกี่ยวข้องกับวัตถุของโรงงานเซสชัน มันช่วยลดเวลาในการเดินทางไปยังฐานข้อมูลเพื่อเพิ่มเวลาตอบสนองของแอพในท้ายที่สุด
แคชระดับแรก
วัตถุเซสชันเก็บข้อมูลแคชระดับแรก มันถูกเปิดใช้งานโดยค่าเริ่มต้น ข้อมูลแคชระดับแรกจะไม่สามารถใช้ได้กับแอปพลิเคชันทั้งหมด แอปพลิเคชันสามารถใช้วัตถุเซสชันจำนวนมาก
แคชระดับที่สอง
วัตถุ SessionFactory เก็บข้อมูลแคชระดับที่สอง ข้อมูลที่เก็บในแคชระดับที่สองจะมีให้สำหรับแอปพลิเคชันทั้งหมด แต่เราต้องเปิดใช้งานอย่างชัดเจน
ในแคชระดับที่สองไฟล์ hbm โดเมนสามารถเป็นคีย์ที่ไม่แน่นอนและค่า false ตัวอย่างเช่นในโดเมนระดับนี้บางช่วงเวลาในหนึ่งวันยังคงเป็นความจริงสากล ดังนั้นจึงสามารถทำเครื่องหมายเป็นไม่เปลี่ยนรูปในแอปพลิเคชัน