1 บทนำสู่ Ehcache
Ehcache เป็นกรอบการแคชในกระบวนการชวาบริสุทธิ์ที่มีคุณสมบัติที่รวดเร็วและไม่ติดมันและเป็น cacheprovider เริ่มต้นในไฮเบอร์เนต
Ehcache เป็นแคชแจกจ่ายโอเพนซอร์สที่ใช้กันอย่างแพร่หลาย มุ่งเป้าไปที่ Universal Cache, Java EE และภาชนะบรรจุน้ำหนักเบา มันมีคุณสมบัติของหน่วยความจำและที่เก็บข้อมูลดิสก์, ตัวโหลดแคช, ส่วนขยายแคช, ตัวจัดการแคชข้อยกเว้น, ตัวกรอง Servlet GZIP และรองรับ APIs และ SOAP APIs
Ehcache ได้รับการพัฒนาโดย Greg Luck ในปี 2003 ในปี 2009 โครงการถูกซื้อโดย Terracotta ซอฟต์แวร์ยังคงเป็นโอเพ่นซอร์ส แต่คุณสมบัติที่สำคัญใหม่บางอย่าง (เช่นความสอดคล้องระหว่างความสามารถในการรีสตาร์ทอย่างรวดเร็ว) สามารถใช้ในผลิตภัณฑ์เชิงพาณิชย์เช่น Ehcache และ BigMemory Enterprise และ BigMemory ปัจจุบัน Wikimedia Foundation ไม่ได้ใช้เทคโนโลยี Ehcache
ในระยะสั้น Ehcache ยังคงเป็นเทคโนโลยีการแคชที่ดี ลองมาดูกันว่า Ehcache ใช้ฤดูใบไม้ผลิอย่างไร
2 ฤดูใบไม้ผลิกับ ehcache
ผลลัพธ์ของระบบมีดังนี้:
3 บทนำการกำหนดค่าเฉพาะ
มีการรวมกันของชิ้นส่วนเหล่านี้:
SRC: รหัส java รวมถึง interceptor, อินเตอร์เฟสการโทร, คลาสทดสอบ
src/cache-bean.xml: กำหนดค่าถั่วที่สอดคล้องกับ ehcache, interceptor และคลาสทดสอบ ฯลฯ
src/ehcache.xml: ehcache แคชข้อมูลการกำหนดค่า
Webroot/lib: ห้องสมุด
4 การแนะนำเนื้อหาโดยละเอียด
4.1 src
4.1.1 interceptor
Interceptors สองตัวถูกกำหนดค่าเป็นครั้งแรกในรหัส:
ตัวดักครั้งแรกคือ:
com.test.ehcache.cachemethodinterceptor
เนื้อหามีดังนี้:
แพ็คเกจ com.test.ehcache; นำเข้า java.io.serializable; นำเข้า net.sf.ehcache.cache; นำเข้า net.sf.ehcache.element; นำเข้า org.aopalliance.intercept.methodinterceptor; นำเข้า org.aopalliance.intercept.methodinvocation org.springframework.util.assert; คลาสสาธารณะ cachemethodinterceptor ใช้ MethodInterceptor, InitializingBean {แคชแคชส่วนตัว; โมฆะสาธารณะ setCache (แคชแคช) {this.cache = แคช; } public cachemethodinterceptor () {super (); } /*** สกัดกั้นวิธีการ ServiceManager และค้นหาว่าผลลัพธ์มีอยู่หรือไม่ หากมีอยู่ให้ส่งคืนค่าในแคช * มิฉะนั้นให้ส่งคืนผลลัพธ์การสืบค้นฐานข้อมูลและใส่ผลลัพธ์การสืบค้นลงในแคช */วัตถุสาธารณะเรียกใช้ (MethodInvocation Invocation) โยนได้ที่ throwable {// รับสตริงคลาส targetName ที่จะดักจับ = chocation.getThis (). getClass () getName (); // รับเมธอดของคลาสที่จะสกัดกั้นสตริงเมธอด name = rachation.getMethod (). getName (); // รับพารามิเตอร์ของวิธีการของคลาสที่จะถูกสกัดกั้นวัตถุ [] อาร์กิวเมนต์ = rachation.getArguments (); ผลลัพธ์ของวัตถุ; // สร้างสตริงเพื่อสร้างคีย์ในแคชสตริง cachekey = getCachekey (targetName, methodName, อาร์กิวเมนต์); // รับข้อมูลจากองค์ประกอบแคช = cache.get (cachekey); if (element == null) {// หากไม่มีข้อมูลในแคชให้มองหาที่ไม่ใช่แคชเช่นฐานข้อมูลและใส่สิ่งที่พบลงใน Cache Result = Invocation.proceed (); // สร้างคีย์และค่าที่จะเก็บไว้ในองค์ประกอบแคช = องค์ประกอบใหม่ (cachekey, (serializable) ผลลัพธ์); System.out.println ("---- ป้อนการค้นหาที่ไม่ใช่แคชเช่นการค้นหาฐานข้อมูลโดยตรงใส่ลงในแคชหลังจากค้นหา"); // จัดเก็บคีย์และค่าลงในแคชแคช. บัท (องค์ประกอบ); } else {// หากมีข้อมูลในแคชมองหาแคช System.out.println ("--- ป้อนการค้นหาแคชอย่ามองหาฐานข้อมูลบรรเทาความดันในฐานข้อมูล"); } return element.getValue (); } /*** วิธีการรับคีย์แคช คีย์แคชเป็นตัวระบุที่ไม่ซ้ำกันขององค์ประกอบในแคช * รวมชื่อแพ็คเกจ + ชื่อคลาส + ชื่อวิธีเช่น: com.test.service.testserviceimpl.getObject */ สตริงส่วนตัว getCachekey (สตริง targetName, สตริงเมธอดชื่อ, อาร์กิวเมนต์ [] อาร์กิวเมนต์) {StringBuffer SB = new StringBuffer (); sb.append (targetName) .append ("."). ผนวก (ชื่อเมธอด); if ((อาร์กิวเมนต์! = null) && (arguments.length! = 0)) {สำหรับ (int i = 0; i <arguments.length; i ++) {sb.append ("."). ผนวก (อาร์กิวเมนต์ [i]); }} ส่งคืน sb.toString (); } / ** * ใช้การเริ่มต้นเบียนตรวจสอบว่าแคชนั้นว่างเปล่า 70 * / โมฆะสาธารณะ AfterPropertIesset () โยนข้อยกเว้น {assert.notNull (แคช "ต้องการแคชโปรดใช้ setCache (แคช) สร้างมัน"); -Cachemethodinterceptor ใช้ในการสกัดกั้นวิธีการเริ่มต้นด้วย "รับ" โปรดทราบว่าการสกัดกั้นการสกัดกั้นครั้งแรกนั้นจะทำการสกัดกั้นครั้งแรกจากนั้นเรียกใช้อินเตอร์เฟสการโทรดั้งเดิม
นอกจากนี้ยังมีตัวดัก:
com.test.ehcache.cacheafterreturningadvice
เนื้อหาเฉพาะ:
แพ็คเกจ com.test.ehcache; นำเข้า java.lang.reflect.method; นำเข้า java.util.list; นำเข้า net.sf.ehcache.cache; นำเข้า org.springframework.aop.afterreturningadvice; Class CacheafterReturningAdvice ดำเนินการ AfterReturningAdvice, InitializingBean {แคชแคชส่วนตัว; โมฆะสาธารณะ setCache (แคชแคช) {this.cache = แคช; } Public CacheafterReturningAdvice () {super (); } โมฆะสาธารณะ ackreturning (Object Arg0, Method Arg1, Object [] arg2, Object Arg3) โยน {String className = arg3.getClass (). getName (); list = cache.getKeys (); สำหรับ (int i = 0; i <list.size (); i ++) {string cachekey = string.valueof (list.get (i)); if (cachekey.startswith (classname)) {cache.remove (cachekey); System.out.println ("----- ล้างแคช"); }}} โมฆะสาธารณะ AfterPropertIesset () พ่นข้อยกเว้น {assert.notNull (แคช "ต้องการแคชโปรดใช้ setCache (แคช) สร้าง"); -CacheFterReturningAdvice ใช้ในการสกัดกั้นวิธีการเริ่มต้นด้วย "อัปเดต" โปรดทราบว่าการสกัดกั้นนี้จะดำเนินการอินเทอร์เฟซการเรียกต้นฉบับก่อนแล้วจึงถูกสกัดกั้น
4.1.2 การเรียกอินเทอร์เฟซ
ชื่ออินเตอร์เฟสคือ:
com.test.service.serviceManager
เนื้อหาเฉพาะมีดังนี้:
แพ็คเกจ com.test.service; นำเข้า java.util.list; อินเตอร์เฟสสาธารณะ servicemanager {รายการสาธารณะ getObject (); โมฆะสาธารณะ updateOdoBject (วัตถุวัตถุ); -ชื่อคลาสการใช้งานคือ:
com.test.service.servicemanagerimpl
เนื้อหาเฉพาะมีดังนี้:
แพ็คเกจ com.test.service; นำเข้า java.util.arraylist; นำเข้า java.util.list; servicemanagerimpl ระดับสาธารณะใช้ serviceManager {@Override รายการสาธารณะ getObject () {system.out.println ("--- คืนค่า null; } @Override โมฆะสาธารณะ updateOdoBject (วัตถุวัตถุ) {system.out.println ("---- serviceManager: วัตถุได้รับการอัปเดตและแคชทั้งหมดที่สร้างโดยคลาสนี้จะถูกลบออก!"); -4.1.3 คลาสทดสอบ
ชื่อคลาสทดสอบคือ:
com.test.service.testmain
เนื้อหาเฉพาะคือ:
แพ็คเกจ com.test.service; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplicationContext; การทดสอบระดับสาธารณะ ApplicationContext Context = ใหม่ classPathxMlApplicationContext (CACHESTRING); // รับถั่วที่สร้างขึ้นโดยพร็อกซีโรงงานพร็อกซีแฟคเตอร์เพื่อสร้างเอฟเฟกต์การสกัดกั้น servicemanager testservice = (servicemanager) บริบท. getBean ("proxyfactory"); // เป็นครั้งแรกที่ค้นหา System.out.println ("===== การค้นหาครั้งแรก"); testService.getObject (); // การค้นหาครั้งที่สอง System.out.println ("===== การค้นหาครั้งที่สอง"); testService.getObject (); // การค้นหาครั้งที่สอง System.out.println ("====== การค้นหาครั้งที่สาม"); TestService.UpDateObject (NULL); // การค้นหาครั้งที่สาม System.out.println ("====== การค้นหาครั้งที่สาม"); testService.getObject (); -หมายเหตุที่นี่ว่าการได้รับถั่วนั้นผลิตโดยพร็อกซีโรงงานพร็อกซีแฟคเตอร์เพื่อให้มีผลการสกัดกั้น
จะเห็นได้ว่ามีการตั้งค่าการโทรสี่ครั้งในคลาสทดสอบและลำดับการดำเนินการคือ:
ค้นหาครั้งแรกค้นหาครั้งที่สองอัปเดตครั้งแรกการค้นหาครั้งที่สาม
4.2 src/cache-bean.xml
cache-bean.xml ใช้ในการกำหนดค่าถั่วที่สอดคล้องกับ ehcache, interceptor และคลาสทดสอบ เนื้อหามีดังนี้:
<? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> <! doctype beans สาธารณะ "-// spring // dtd bean // en" "http://www.springframework.org/dtd/spring-beans.dtd" <property name = "configlocation"> <value> ehcache.xml </value> </property> </ebean> <!-กำหนดโรงงานของ ehcache และตั้งชื่อแคชที่ใช้นั่นคือ "com.tt"-> <bean id = "ehcache"> <property = "cachemanager" แคช-> <property name = "cachename"> <value> com.tt </value> </property> </ebean> <!-ตัวดักจับสำหรับการสร้างแคชและแคชแบบสอบถาม-> <bean id = "cachemethodinterceptor"> <property name = "cache"> <ref local = "ehcache"/> แคช-> <bean id = "cacheafterreturningadvice"> <property name = "cache"> <ref local = "ehcache" /> < /property> </epean> <! interceptor ที่นี่ com.test.ehcache.cachemethodinterceptor-> <bean id = "cachepointcut"> <!-เพิ่มส่วนส่วนคือส่วนที่เพิ่มหลังจากดำเนินการวิธีการพิมพ์-> <property name = "คำแนะนำ"> อักขระ ### + หมายถึงการสอดคล้องกับอักขระก่อนหน้าหนึ่งครั้งหรือหลายครั้ง ###* หมายถึงการสอดคล้องกับอักขระก่อนหน้าศูนย์หรือหลายครั้ง ###/หลบหนีสัญลักษณ์ใด ๆ ที่ใช้ในนิพจน์ทั่วไป-> <!-.* หมายถึงคำนำหน้าก่อนหน้า (รวมถึงชื่อแพ็คเกจ) ชื่อวิธีและลักษณะของชื่อวิธีการสกัดกั้น interceptor ฯลฯ โทรหา interceptor com.test.ehcache.cacheafterreturningadvice-> <bean id = "cachepointcutadvice"> <property name = "คำแนะนำ"> <refocal = "cacheafterreturningadvice" /> ชื่อ) ซึ่งหมายถึงเมธอด UpdateObject-> <dange>.*อัปเดต*</alues> </list> </property> </ebean> <!-Agent Factory-> <bean id = "ProxyFactory"> <! <slist> <value> cachepointcut </alue> <value> CachepointCutAdvice </value> </list> </property> </epeans>
เนื้อหาของถั่วแต่ละตัวได้รับการแสดงความคิดเห็นและสังเกตว่าอย่าลืมถั่วเป็นตัวแทน
4.3 src/ehcache.xml
ehcache.xml เก็บข้อมูลรายละเอียดเกี่ยวกับการกำหนดค่าแคช ehcache ดังต่อไปนี้:
<? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> <ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespaceschemalocation = "http://ehcache.org <diskstore path = "d: // temp // cache"/> <defaultCache maxElementsInMemory = "1000" Eternal = "false" timetoidleseconds = "120" timetoliveseconds = "120" overflowTodisk = "true"/> <! name = "com.tt" maxElementsInMemory = "10,000" Eternal = "false" timetoidleseconds = "300000" timetoliveseconds = "600000" overflowTodisk = "true" /> </ehcache>
คุณจะเห็นว่าตำแหน่งที่เก็บข้อมูลของที่เก็บข้อมูลแคชถูกตั้งค่าเป็น "d:/temp/cache" และชื่อแคชถูกตั้งค่าเป็น "com.tt" ดังที่แสดงในรูป:
4.4 Webroot/lib
สำหรับไลบรารี Java ที่ต้องการโปรดดูรูปภาพโครงสร้างระบบที่จุดเริ่มต้นละเว้นที่นี่
5 การทดสอบ
ดำเนินการคลาสทดสอบและผลการทดสอบมีดังนี้:
ผ่านผลการดำเนินการที่เราเห็น:
หลังจาก การค้นหาครั้งแรก ถูกดักจับพบว่ามันเป็นสกัดกั้นครั้งแรกและแคชยังไม่ได้รับการแคช ดังนั้นก่อนอื่นให้ดำเนินการคลาสอินเตอร์เฟสดั้งเดิมเพื่อให้ข้อมูลถูกสอบถาม มันอาจจะได้รับผ่านการสืบค้นฐานข้อมูลจากนั้นสร้างแคชและใส่ข้อมูลแบบสอบถามลงในแคช
หลังจาก การค้นหาครั้งที่สอง ถูกดักจับพบว่าแคชมีอยู่แล้วดังนั้นคลาสอินเตอร์เฟสดั้งเดิมจะไม่ถูกดำเนินการอีกต่อไปนั่นคือฐานข้อมูลไม่ได้ทำการสืบค้นอีกต่อไปและข้อมูลการสอบถามจะได้รับโดยตรงผ่านแคช แน่นอนว่ามันเป็นเพียงการพิมพ์ง่ายๆที่นี่
จากนั้นมี การอัปเดตครั้งแรก การดำเนินการหลังจากถูกดักจับคือการจัดเก็บข้อมูลทั้งหมดในแคชลงในฐานข้อมูลและลบแคช
ในที่สุดก็มี แบบสอบถามที่สาม หลังจากถูกดักจับพบว่าระบบไม่มีแคชดังนั้นฐานข้อมูลการสืบค้นคลาสอินเตอร์เฟสดั้งเดิมสร้างแคชและวางข้อมูลที่ได้จากแบบสอบถามใหม่ลงในแคช วิธีเดียวกับแบบสอบถามแรก
จนถึงตอนนี้เราได้นำสิ่งที่ต้องทำในฤดูใบไม้ผลิด้วย Ehcache
6 ซอร์สโค้ดไฟล์แนบ
สามารถรับซอร์สโค้ดไฟล์แนบได้จากเว็บไซต์ GitHub ของฉัน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น