1 Einführung in EHCache
Ehcache ist ein reines Java-In-Prozess-Caching-Framework mit schnellen und schlanken Funktionen und standardmäßig CacheProvider in Hibernate.
EHCache ist ein weit verbreiteter Open -Source -Java -verteilter Cache. Hauptsächlich an universelle Cache, Java EE und leichte Behälter. Es verfügt über die Funktionen des Speicher- und Festplattenspeichers, des Cache -Loaders, der Cache -Erweiterung, des Cache -Ausnahme -Handlers, eines GZIP -Cache -Servlet -Filters und unterstützt REST- und SOAP -APIs.
EHCache wurde ursprünglich von Greg Luck im Jahr 2003 entwickelt. 2009 wurde das Projekt von Terracotta gekauft. Die Software ist immer noch Open Source, aber einige neue Hauptmerkmale (z. B. Konsistenz zwischen schneller Neustartfähigkeit) können nur in kommerziellen Produkten wie EHCache und BigMemory verwendet werden. Die Wikimedia FoundationAnnounced verwendet derzeit die EHCACHE -Technologie.
Kurz gesagt, EHCache ist immer noch eine gute Caching -Technologie. Schauen wir uns an, wie der Frühling mit EHCache implementiert wird.
2 Feder mit EHCache
Die Systemergebnisse sind wie folgt:
3 Spezifische Konfigurationseinführung
Es gibt Kombinationen dieser Teile:
SRC: Java -Code, einschließlich Interceptor, Rufschnittstelle, Testklasse
src/cache-bean.xml: Konfigurieren Sie die Bean, die EHCache, Interceptor- und Testklassen usw. entspricht, usw.
src/ehcache.xml: EHCACHE -Cache -Konfigurationsinformationen
Webroot/lib: Bibliothek
4 detaillierte Inhaltseinführung
4.1 src
4.1.1 Interceptor
Zwei Interceptors werden zuerst im Code konfiguriert:
Der erste Interceptor ist:
com.test.ehcache.cachemethodinterceptor
Der Inhalt ist wie folgt:
Paket com.test.ehcache; import Java.io.Serializable; import net.sf.ehcache.cache; import net.sf.ehcache.element; import org.aopalliance org.springframework public void setCache (cache cache) {this.cache = cache; } public cachemethodinterceptor () {Super (); } /*** Abfangen die Servicemanager -Methode und finden Sie heraus, ob das Ergebnis vorhanden ist. Wenn es existiert, geben Sie den Wert im Cache zurück. * Andernfalls senden Sie das Ergebnis der Datenbank -Abfrage zurück und setzen Sie das Abfrageergebnis in Cache */public Object auf. // Die Methode der Klasse zum Intercepted String methodname = invocation.getMethod (). GetName (); // Die Parameter der Methode der Klasse abnehmen, um Objekt zu sein. Objektergebnis; // Erstellen Sie einen String, um den Schlüssel in Cache String cachekey = getCacheKey (TargetName, MethodName, Argumente) zu erstellen. // Daten von Cache Element Element = cache.get (cachekey) abrufen; if (element == null) {// Wenn es keine Daten im Cache enthalten, suchen Sie nach Nicht-Cache, z. B. in der Datenbank, und geben Sie die gefundenen in cache result = invocation.proceed (); // Generieren Sie den Schlüssel und den Wert, der im Cache -Element = neues Element (Cachekey, (serialisierbar)) gespeichert wird. System.out.println ("---- Eingabetaste Nicht-Cache-Suche, z. B. die Suche nach der Datenbank direkt, um sie nach der Suche in den Cache zu setzen"); // Speichern Sie den Schlüssel und den Wert in Cache -Cache.put (Element); } else {// Wenn Daten im Cache vorhanden sind, suchen Sie nach Cache System.out.println ("--- Geben Sie die Cache-Suche ein, suchen Sie nicht nach der Datenbank und lindern den Druck auf die Datenbank"); } return element.getValue (); } /*** Methode, um die Cache -Taste zu erhalten. Die Cache -Taste ist die eindeutige Kennung eines Elements im Cache. * Einschließlich des Paketnamens + Klassenname + Methodenname, wie z. B. com.test.service.testserviceImpl.getObject sb.Append (targetName) .Append ("."). append (methodName); if ((Argumente! = null) && (Argumente.length! }} return sb.toString (); } / ** * Implementieren Sie die Initialisierungsbean und prüfen Sie, ob der Cache leer ist. }}Cachemethodinterceptor wird verwendet, um Methoden abzufangen, die mit "get" beginnen. Beachten Sie, dass dieser Interceptor zuerst die ursprüngliche Anrufschnittstelle ausführt und dann ausführt.
Es gibt auch einen Interceptor:
com.test.ehcache.cacheFterReturningAdvice
Spezifischer Inhalt:
Paket com.test.ehcache; import java.lang.reflect.method; import java.util.list; net.sf.ehcache.cache; CACHEFTERRETRETURNINGADVICE implementiert AFFRETURNINGADVICE, initialisierungsbean {privater Cache -Cache; public void setCache (cache cache) {this.cache = cache; } public CACHEFTERTRETURNINGADVICE () {Super (); } public void ungreturning (Object arg0, method arg1, object [] arg2, Object arg3) löscht Throwable {String className = arg3.getClass (). getName (); Listlist = cache.getkeys (); für (int i = 0; i <list.size (); i ++) {String cachekey = string.ValueOf (list.get (i)); if (cachekey.startsWith (className)) {cache.remove (cachekey); System.out.println ("----- Cache Cache"); }}} public void AfterPertieSt () löst eine Ausnahme aus {assert.notnull (Cache, "benötigen einen Cache. Bitte verwenden Sie SetCache (Cache)."); }}CACHEFERRETRETURNINGADVICE wird verwendet, um Methoden abzufangen, beginnend mit "Update". Beachten Sie, dass dieser Interceptor zuerst die ursprüngliche Anrufschnittstelle ausführt und dann abgefangen wird.
4.1.2 Aufrufen der Schnittstelle
Der Schnittstellenname lautet:
com.test.service.serviceManager
Der spezifische Inhalt ist wie folgt:
Paket com.test.service; import java.util.list; public interface serviceManager {public list getObject (); public void UpdateObject (Objektobjekt); }Der Name der Implementierungsklasse lautet:
com.test.service.serviceManagerImpl
Der spezifische Inhalt ist wie folgt:
Paket com.test.service; import Java.util.ArrayList; importieren java.util.list; public class servicemanagerimpl implementiert servicemanager {@Override public list getObject () {System.out.println ("---- Servicemanager: Dieses Element existiert nicht in der Cache, und das Cache. null zurückkehren; } @Override public void updateObject (Objektobjekt) {System.out.println ("---- Servicemanager: Das Objekt wird aktualisiert, und alle von dieser Klasse generierten Caches werden entfernt!"); }}4.1.3 Testklasse
Der Testunterrichtsname lautet:
com.test.service.testmain
Der spezifische Inhalt ist:
paket com.test.service; import org.springframework.context.applicationcontext; import org.springframework.context.support.classPhePhxMlapplicationContext; public class testmain {public static void main (String [] args) {String cachestring = "/cachenbean.xml"; ApplicationContext context = new classPathXmlApplicationContext (cachestring); // Erhalten Sie die Bean, die vom Proxy Factory Proxyfactory generiert wird, um einen Interception -Effekt zu generieren. // Das erste Mal sucht system.out.println ("===== Erste Suche"); testService.getObject (); // das zweite Mal suchs system.out.println ("===== second such"); testService.getObject (); // Das zweite Mal suchs system.out.println ("====== Das dritte Mal durchsuche"); testService.UpdateObject (null); // Das dritte Mal suchs system.out.println ("====== Das dritte Mal durchsuche"); testService.getObject (); }}Beachten Sie hier, dass das Erhalten von Bohnen vom Proxyfaktor der Proxy Factory produziert wird, so dass es einen Abfangenseffekt geben wird.
Es ist ersichtlich, dass in der Testklasse vier Anrufe festgelegt sind und die Ausführungsreihenfolge lautet:
Erster Lookup Zweiter Lookup Erstes Update der dritte Suche
4.2 src/cache-bean.xml
cache-bean.xml wird verwendet, um Bohnen zu konfigurieren, die EHCACHE, Interceptor- und Testklassen entsprechen. Der Inhalt ist wie folgt:
<? <Eigenschaft name = "configLocation"> <wert> ehcache.xml </value> </property> </bean> <!-Definieren Sie die Fabrik von Ehcache und setzen Cache-> <Eigenschaft name = "cacheName"> <wert> com.tt </value> </property> </bean> <! cache-> <bean id = "cacheonfterReturningAdvice"> <Eigenschaft name = "cache"> <ref local = "ehcache" /> < /property> < /bean> <!-Die Schnittstelle nennen Sie die Schnittstelle, das abgefangene Objekt-> <bean id = "Servicemanager" /> <!-Einfügen. Interceptor hier com.test.ehcache.cachemethodinterceptor-> <bean id = "cachepointcut"> <! Zeichen ### + bedeutet, einmal oder mehrmals ### ##################################/Escape Jedes Symbol, das im regulären Ausdruck verwendet wird-> <!-. Merkmale des Interceptor-Abfangen-Methodennamens usw. Nennen Sie den Interceptor com.test.ehcache.CACHEFTERRETURNINGADVICE-> <bean id = " Dies bedeutet UpdateObject-Methode-> <Wert>.*Update.*</value> </list> </property> </bean> <!-Agent Factory-> <bean id = "proxyfactory"> <!-Beschreibung Call Interface Bean-Name-> <Eigenschaft Name = "Ziel"> <empfangs. <wert> cachepointcut </value> <wert> cachepointcutadvice </value> </list> </property> </beans>
Der Inhalt jeder Bean wurde kommentiert und stellte fest, dass nicht vergessen wird, Fabrikbohnen zu verbringen.
4.3 src/ehcache.xml
EHCache.xml speichert detaillierte Informationen zur EHCACHE -Cache -Konfiguration wie folgt:
<? <diskstore path = "d: // temp // cache"/> <defaultCache maxelementsinmemory = "1000" eternal = "false" Timetoidleseconds = "120" TimetoliveSeconds = "120" Überlauf = "True"/> <!-Define Cache-Datei-Informationen "Cache", wo "cache" -File-Dateien "Cache" -File "-Dateien" -Informationen ", in der" Cache "-File", "Cache", wo "Cache" -Dateien ", wob name = "com.tt" maxelementsInmemory = "10000" eternal = "false" timetoidleseconds = "300000" TimetoliveSeconds = "600000" überlaufen
Sie können sehen, dass der Speicherort des zwischengespeicherten Speichers auf "D:/temp/cache" gesetzt ist und der Cache -Name auf "com.tt" gesetzt ist, wie in der Abbildung gezeigt:
4.4 Webroot/lib
Für die erforderliche Java -Bibliothek finden Sie am Anfang das Bild der Systemstruktur, die hier weggelassen wurden.
5 Test
Führen Sie die Testklasse aus, und die Testergebnisse sind wie folgt:
Durch die Ausführungsergebnisse können wir sehen:
Nachdem die erste Suche abgefangen wurde, wird festgestellt, dass es der erste Schnittpunkt ist und der Cache nicht zwischengespeichert wurde. Führen Sie also zunächst die ursprüngliche Schnittstellenklasse aus, um die zu abfragenden Daten zu erhalten. Es kann durch Datenbankabfrage erhalten werden, dann den Cache generieren und die abgefragten Daten in den Cache einfügen.
Nachdem die zweite Suche abgefangen worden war, wurde festgestellt, dass der Cache bereits vorhanden ist, sodass die ursprüngliche Schnittstellenklasse nicht mehr ausgeführt wird, dh die Datenbank ist nicht mehr abfragt und die Abfragedaten werden direkt über den Cache erhalten. Natürlich ist es hier nur ein einfacher Druck.
Dann gibt es das erste Update . Der Vorgang, der nach Abnahme durchgeführt wurde, besteht darin, alle Daten im Cache in die Datenbank zu speichern und den Cache zu löschen.
Schließlich gibt es die dritte Frage . Nach Abfangen wurde festgestellt, dass das System keinen Cache hat, sodass die ursprüngliche Schnittstellenklasse -Abfragedatenbank einen Cache erstellen und die von der neuen Abfrage erhaltenen Daten in den Cache einfügen. Die gleiche Methode wie die erste Abfrage.
Bisher haben wir implementiert, was im Frühling mit Ehcache getan werden muss.
6 Anhangsquellcode
Der Anhangsquellcode kann von meiner GitHub -Website erhalten werden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.