1. บทนำสู่ MyBatis Cache
เช่นเดียวกับเฟรมเวิร์กเลเยอร์การคงอยู่ส่วนใหญ่ MyBatis ยังให้การสนับสนุนแคช L1 และ L2
1. ระดับ 1 แคช:
แคชท้องถิ่น HashMap ที่ใช้ PerpetualCache มีขอบเขตการจัดเก็บของเซสชัน หลังจากการล้างเซสชันหรือปิดแคชทั้งหมดในเซสชั่นจะถูกล้าง
2. ระดับ 2 แคช:
แคชระดับที่สองนั้นเหมือนกับแคชระดับแรกและค่าเริ่มต้นคือการจัดเก็บ PerpetualCache และ HashMap ความแตกต่างคือขอบเขตการจัดเก็บคือ MAPPER (เนมสเปซ) และสามารถปรับแต่งแหล่งเก็บข้อมูลเช่น EHCACHE
3. สำหรับกลไกการอัปเดตข้อมูลแคช เมื่อขอบเขตที่แน่นอน (เซสชันแคชระดับแรก/เนมสเปซแคชระดับที่สอง) จะดำเนินการแคชทั้งหมดในการเลือกภายใต้ขอบเขตนี้จะถูกล้างโดยค่าเริ่มต้น
1.1. การทดสอบแคชระดับ 1 mybatis
แพ็คเกจ me.gacl.test; นำเข้า me.gacl.domain.user; นำเข้า me.gacl.util.mybatisutil; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า org.junit.test;/*** @author gacl* ค่าเริ่มต้น)*/@testpublic เป็นโมฆะ testCache () {sqlSession session = myBatisutil.getSqlSession (); string statement = "me.gacl.mapping.usermapper.getUser" ผู้ใช้ = เซสชัน SESSECTONE (คำสั่ง) ); System.out.println (ผู้ใช้); session.close ();/* มันจะต้องเป็นเซสชั่นเดียวกัน หากวัตถุเซสชันถูกปิด () มันเป็นไปไม่ได้ที่จะใช้ */เซสชัน = mybatisutil.getSqlSession (); user = session.selectone (คำสั่ง); system.out.println (ผู้ใช้);/ * เงื่อนไขการสืบค้นเป็น */user = user = session.selectone (คำสั่ง); system.out.println (ผู้ใช้);/ * ไม่มีเซสชัน clearcache () ถูกดำเนินการเพื่อทำความสะอาดแคช*/// session.clearcache (); user = session.selectone (คำสั่ง); system.out.println (ผู้ใช้);/* ไม่มีการดำเนินการเพิ่ม/ลบ (การดำเนินการเหล่านี้จะทำความสะอาดแคช)*/session.update ("me.gacl.mapping.usermapper.updateuser", ผู้ใช้ใหม่ (, "ผู้ใช้",)); user = session.selectone (คำสั่ง); system.out.println (ผู้ใช้); 1.2. การทดสอบแคช MyBatis ระดับ 2
1. เปิดแคชรองและเพิ่มการกำหนดค่าต่อไปนี้ในไฟล์ usermapper.xml
<mapper namespace = "me.gacl.mapping.usermapper"> <!-เปิดแคชระดับ 2-> <แคช/>
2. ทดสอบแคชทุติยภูมิ
แพ็คเกจ me.gacl.test; นำเข้า me.gacl.domain.user; นำเข้า me.gacl.util.mybatisutil; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า org.apache.ibatis.session.sqlsessionfory; TestTwolevelCache {/** แคชระดับ 2 ทดสอบ* ใช้วัตถุ SQLSession สองวัตถุที่แตกต่างกันเพื่อดำเนินการสืบค้นด้วยเงื่อนไขการสืบค้นเดียวกัน คำสั่ง SQL จะไม่ถูกส่งในระหว่างการสืบค้นที่สอง แต่ข้อมูลจะถูกดึงโดยตรงจากแคช*/@testpublic void testcache () {string statement = "me.gacl.mapping.usermapper.getuser"; Factory.opensession (); SQLSession Session = Factory.opensession (); // เมื่อใช้แคชรองคลาสผู้ใช้จะต้องใช้อินเตอร์เฟส serializable ===> ผู้ใช้ใช้ SerializableUser user = session.selectone (คำสั่ง); session.commit () System.out.println ("user ="+ผู้ใช้); // เนื่องจากมีการใช้วัตถุ SQLSession สองวัตถุที่แตกต่างกันแม้ว่าเงื่อนไขการสืบค้นจะเหมือนกันแคชระดับแรกจะไม่ถูกเปิดใช้งาน user = session.selectone (คำสั่ง,); // session.commit (); system.out.println ("user ="+ผู้ใช้);}} 1.3. คำแนะนำเพิ่มเติมสำหรับแคชทุติยภูมิ
1. คำสั่ง SELECT ทั้งหมดในไฟล์คำสั่งการแมปจะถูกแคช
2. แผนที่ทั้งหมดแทรกอัปเดตและลบคำสั่งในไฟล์คำสั่งจะรีเฟรชแคช
3. แคชจะถูกลองใหม่โดยใช้อัลกอริทึมที่ใช้น้อยที่สุดเมื่อเร็ว ๆ นี้ (LRU ซึ่งใช้น้อยที่สุด)
4. แคชจะถูกรีเฟรชตามช่วงเวลาที่กำหนด
5. แคชจะจัดเก็บ 1024 วัตถุ
คุณสมบัติทั่วไปของแท็กแคช:
<Cache Eviction = "FIFO" <!-กลยุทธ์การรีไซเคิลเป็นครั้งแรก-ออกแรก-> flushInterval = "60000" <!-เวลารีเฟรชอัตโนมัติ 60S-> size = "512" <!
ฉันจะให้ความรู้แก่คุณ:
เช่นเดียวกับไฮเบอร์เนต MyBatis ยังมีกลไกแคช
แคชระดับ 1 ขึ้นอยู่กับแคชท้องถิ่น HashMap ของ PerpetualCache (mybatis มาพร้อมกับ) และขอบเขตของมันคือเซสชันดังนั้นเมื่อเซสชันจะกระทำหรือปิดแคชจะถูกล้าง
แคชระดับที่สองนั้นขึ้นอยู่กับ PerpetualCache โดยค่าเริ่มต้น แต่สามารถใช้ในการสร้างแหล่งเก็บข้อมูลเช่น EHCache
แคชแคชระดับแรกแคช SQL ในขณะที่แคชแคชระดับที่สองของวัตถุผลลัพธ์ ดูตัวอย่างต่อไปนี้ (ระดับบันทึกของ MyBatis ถูกตั้งค่าเป็น debug)