แคชระดับแรกและระดับที่สองในไฮเบอร์เนตคืออะไร


245

ทุกคนสามารถอธิบายด้วยคำพูดง่ายๆว่าการแคชระดับแรกและระดับที่สองในไฮเบอร์เนตคืออะไร?

คำตอบ:


300

1.1) แคชระดับแรก

แคชระดับแรกเชื่อมโยงกับวัตถุเซสชันเสมอ ไฮเบอร์เนตใช้แคชนี้เป็นค่าเริ่มต้น ที่นี่จะประมวลผลหนึ่งธุรกรรมหลังจากอีกธุรกรรมหนึ่งหมายความว่าจะไม่ดำเนินการหนึ่งธุรกรรมหลายครั้ง ส่วนใหญ่จะลดจำนวนแบบสอบถาม SQL ที่ต้องการสร้างภายในการทำธุรกรรมที่กำหนด นั่นคือแทนที่จะอัปเดตหลังจากการปรับเปลี่ยนทุกครั้งที่ทำในธุรกรรมนั้นเป็นการอัพเดตธุรกรรมเฉพาะเมื่อสิ้นสุดธุรกรรม

1.2) แคชระดับที่สอง

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

อ้างจาก: http://javabeat.net/introduction-to-hibernate-caching/


38
+1 สำหรับการแมปแคชระดับแรกกับวัตถุเซสชันและแคชระดับสองกับวัตถุโรงงานเซสชัน ฉันไม่จำเป็นต้องอ่านต่อไป
Mahes

1
แคชระดับที่ 1 ในกรณีส่วนใหญ่ไม่จำเป็น แต่ไม่มีตัวเลือกที่จะกำจัดมัน แต่คุณควรคิดถึงมันตลอดเวลา ..
ses

6
@ses คุณจะต้องใช้แคชระดับที่ 1 ในกรณีส่วนใหญ่ มิฉะนั้นคุณจะมีปัญหาเรื่องประสิทธิภาพที่ไม่ดีเช่นการค้นหาแบบ N + 1 หรือไม่มีแคชการดึงข้อมูลล่วงหน้าหรือแบบสอบถามทุกครั้งที่คุณเข้าถึงแอตทริบิวต์
Dennis C

โดยปกติเราจะใช้เซสชันในช่วงเวลาสั้น ๆ [และมีเนื้อหาแนะนำให้ใช้] / ช่วงเวลาสั้น: เราไม่ใช้แคชนั้นในช่วงเวลานั้น หากเซสชั่นมีอายุการใช้งานนานเราจะยกเลิกการเชื่อมต่อข้อมูล (เมื่อแก้ไขแบบฟอร์มตัวอย่าง) จากเซสชัน ดูเหมือนว่าจำเป็นสำหรับสถานการณ์สมมติเดียวเท่านั้นเมื่อเราพยายามใช้ query-session-api ในขณะที่สร้างคำขอที่ซับซ้อนหลังจากคำขอยาวเซสชัน
ses

1
@DennisCheung: ลิงก์นั้นตาย โปรดอัปเดตด้วยjavabeat.net/introduction-to-hibernate-caching
NewUser

118

มีคำอธิบายที่ดีเกี่ยวกับการแคชระดับแรกในบล็อกStreamline Logic

โดยทั่วไปการแคชระดับแรกจะเกิดขึ้นในแต่ละเซสชันซึ่งการแคชระดับที่สองสามารถแชร์ข้ามหลายเซสชันได้


20
นั่นเป็นคำง่าย ๆ ที่นั่นฉันไม่รู้ว่าทำไมพวกเขาถึงมีเวลาอธิบายยาก ๆ
BlackTigerX

ฮิฮิ ... ใช่ผมไม่ทราบจริงๆว่าฉันจะมีอากาศง่ายมาก :)
lomaxx

2
ที่จริงแล้วนี่ชัดเจนกว่าสำหรับฉัน แรกคือสำหรับแต่ละเซสชั่นที่สองสำหรับเซสชั่นหลายง่ายสำหรับฉันที่จะจำไว้เราไม่ได้ลงคะแนนสองครั้ง? : D
อาจารย์สีดำ

1
ไม่มีตัวอย่างว่าทำไมต้องการแคชระดับที่ 1 สำหรับฉันในกรณีส่วนใหญ่มันไม่จำเป็นเลย แต่คุณควรคิดถึงมันและเกี่ยวกับเซสชั่นตลอดเวลา
ses

มัน 11 ปีนับตั้งแต่คำตอบนี้และน่าเสียดายที่ไม่มีลิงค์นี้ในขณะนี้ แต่ฉันพบเนื้อหาในหน้าเว็บเก็บถาวร: web.archive.org/web/20081207044228/http://…
Golu

105

ต่อไปนี้เป็นคำอธิบายพื้นฐานของแคชไฮเบอร์เนต ...

แคชระดับแรกเกี่ยวข้องกับวัตถุ“ เซสชัน” ขอบเขตของวัตถุแคชเป็นของเซสชั่น เมื่อเซสชั่นถูกปิดวัตถุที่แคชจะหายไปตลอดกาล แคชระดับแรกเปิดใช้งานโดยค่าเริ่มต้นและคุณไม่สามารถปิดใช้งานได้ เมื่อเราสอบถามเอนทิตีครั้งแรกมันจะถูกดึงจากฐานข้อมูลและเก็บไว้ในแคชระดับแรกที่เกี่ยวข้องกับการจำศีลเซสชั่น ถ้าเราสอบถามวัตถุเดียวกันอีกครั้งด้วยวัตถุเซสชันเดียวกันมันจะถูกโหลดจากแคชและจะไม่มีการดำเนินการสืบค้น SQL เอนทิตีที่โหลดสามารถลบออกจากเซสชันโดยใช้evict()วิธีการ การโหลดครั้งต่อไปของเอนทิตีนี้จะทำการเรียกฐานข้อมูลอีกครั้งหากถูกลบโดยใช้evict()วิธีการ แคชเซสชันทั้งหมดสามารถลบได้โดยใช้clear()วิธีการ มันจะลบเอนทิตีทั้งหมดที่เก็บไว้ในแคช

แคชระดับที่สองนั้นแตกต่างจากแคชระดับแรกที่พร้อมใช้งานทั่วโลกในขอบเขตโรงงานเซสชัน แคชระดับที่สองถูกสร้างขึ้นในขอบเขตโรงงานเซสชันและพร้อมที่จะใช้ในเซสชันทั้งหมดที่สร้างขึ้นโดยใช้โรงงานเซสชันนั้น นอกจากนี้ยังหมายความว่าเมื่อโรงงานเซสชันถูกปิดแคชทั้งหมดที่เกี่ยวข้องกับมันจะตายและผู้จัดการแคชก็ปิดตัวลงเช่นกัน เมื่อใดก็ตามที่เซสชันไฮเบอร์เนตพยายามโหลดเอนทิตีสถานที่แรกที่ค้นหาสำเนาแคชของเอนทิตีในแคชระดับแรก (เกี่ยวข้องกับเซสชันไฮเบอร์เนตโดยเฉพาะ) หากสำเนาแคชของเอนทิตีมีอยู่ในแคชระดับแรกจะถูกส่งคืนเนื่องจากผลลัพธ์ของวิธีโหลด หากไม่มีเอนทิตีแคชในแคชระดับแรกแคชระดับที่สองจะค้นหาเอนทิตีแคช หากแคชระดับที่สองมีเอนทิตีแคชจะถูกส่งคืนเนื่องจากวิธีการโหลด แต่, ก่อนที่จะส่งคืนเอนทิตีมันจะถูกเก็บไว้ในแคชระดับแรกเช่นกันเพื่อให้การเรียกใช้วิธีโหลดครั้งถัดไปสำหรับเอนทิตีจะส่งคืนเอนทิตีจากแคชระดับแรกเองและไม่จำเป็นต้องไปที่แคชระดับที่สองอีก หากไม่พบเอนทิตีในแคชระดับแรกและแคชระดับที่สองจะมีการดำเนินการค้นหาฐานข้อมูลและเก็บเอนทิตีในระดับแคชทั้งสองก่อนกลับมาเป็นการตอบสนองของload() วิธี.


2
คำอธิบายที่ยอดเยี่ยม! ถ้าคุณวาดไดอะแกรมต่อเนื่องมันจะยอดเยี่ยม !!!
Adelin

คำอธิบายอย่างละเอียดและดี
ManishS

1
หากคุณต้องการแก้ไขสิ่งที่คุณรู้แล้วคำตอบสองข้อข้างต้นโดย Dennis C และ Iomaxx นั้นยอดเยี่ยมรวบรัดมากและจดจำได้ง่าย หากคุณกำลังมองหาคำอธิบายของความแตกต่างเมื่อคุณยังไม่ทราบคำตอบนี้ดีกว่ามาก!
วิญญาณนักเรียน

คำอธิบายที่ดี !!
blu3

17

นี่เป็นคำถามที่พบบ่อยมากดังนั้นคำตอบนี้เป็นไปตามบทความที่ฉันเขียนในบล็อกของฉัน

แคชระดับแรก

Hibernate พยายามที่จะเลื่อนบริบทการคงอยู่ไปจนถึงวินาทีสุดท้ายที่เป็นไปได้ อย่างที่ฉันอธิบายไว้ในบทความนี้นี้กลยุทธ์นี้เป็นที่รู้จักกันในชื่อการทำธุรกรรม

การเขียนที่เกี่ยวข้องกับการไฮเบอร์เนตล้างมากกว่าธุรกรรมทางตรรกะหรือทางกายภาพใด ๆ ในระหว่างการทำธุรกรรมการล้างข้อมูลอาจเกิดขึ้นหลายครั้ง

ป้อนคำอธิบายรูปภาพที่นี่

การเปลี่ยนแปลงที่ถูกล้างข้อมูลจะมองเห็นได้เฉพาะสำหรับธุรกรรมฐานข้อมูลปัจจุบัน จนกว่าจะมีการทำธุรกรรมปัจจุบันจะไม่มีการเปลี่ยนแปลงใด ๆ เกิดขึ้นพร้อมกันในการทำธุรกรรมอื่น ๆ

เนื่องจากแคชระดับแรก Hibernate สามารถทำการเพิ่มประสิทธิภาพหลายอย่าง:

แคชระดับที่สอง

โซลูชันแคชที่เหมาะสมจะต้องครอบคลุมช่วงไฮเบอร์เนตหลายครั้งและนั่นคือเหตุผลที่ไฮเบอร์เนตรองรับแคชระดับที่สองเพิ่มเติมเช่นกัน

แคชระดับที่สองถูกผูกไว้กับวงจรชีวิตของ SessionFactory ดังนั้นมันจะถูกทำลายก็ต่อเมื่อSessionFactoryถูกปิด (โดยทั่วไปคือเมื่อแอปพลิเคชันปิด) แคชระดับที่สองนั้นมุ่งเน้นที่เอนทิตีเป็นหลักแม้ว่าจะสนับสนุนโซลูชันการแคชแบบสอบถามที่เป็นตัวเลือกเช่นกัน

สำหรับรายละเอียดเพิ่มเติมโปรดดูบทความนี้


3

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

ดังนั้นคำถามของปัญหาเหล่านี้คือการใช้แคช L2 ซึ่งเกี่ยวข้องกับวัตถุของโรงงานเซสชัน มันช่วยลดเวลาในการเดินทางไปยังฐานข้อมูลเพื่อเพิ่มเวลาตอบสนองของแอพในท้ายที่สุด


1

แคชระดับแรก

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

แคชระดับที่สอง

วัตถุ SessionFactory เก็บข้อมูลแคชระดับที่สอง ข้อมูลที่เก็บในแคชระดับที่สองจะมีให้สำหรับแอปพลิเคชันทั้งหมด แต่เราต้องเปิดใช้งานอย่างชัดเจน


-4

ในแคชระดับที่สองไฟล์ hbm โดเมนสามารถเป็นคีย์ที่ไม่แน่นอนและค่า false ตัวอย่างเช่นในโดเมนระดับนี้บางช่วงเวลาในหนึ่งวันยังคงเป็นความจริงสากล ดังนั้นจึงสามารถทำเครื่องหมายเป็นไม่เปลี่ยนรูปในแอปพลิเคชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.