1 Introduction à ehcache
Ehcache est un cadre de mise en cache Java en Java pur, avec des fonctionnalités rapides et maigres, et est le cacheprovider par défaut en hibernate.
Ehcache est un cache distribué Java open source largement utilisé. Dirigeait principalement le cache universel, le Java EE et les conteneurs légers. Il a les caractéristiques du stockage de mémoire et de disque, le chargeur de cache, l'extension de cache, le gestionnaire d'exceptions de cache, un filtre de servlet de cache GZIP et prend en charge les API de repos et de savon.
Ehcache a été initialement développé par Greg Luck en 2003. En 2009, le projet a été acheté par Terracotta. Le logiciel est toujours open source, mais certaines nouvelles fonctionnalités majeures (par exemple, la cohérence entre le redémarnabilité rapide) ne peuvent être utilisées que dans des produits commerciaux, tels que l'entreprise Ehcache et BigMemory. Wikimedia Foundationnonnenced actuellement utilise la technologie ehcache.
En bref, Ehcache est toujours une bonne technologie de mise en cache. Voyons comment le printemps est implémenté avec ehcache.
2 printemps avec ehcache
Les résultats du système sont les suivants:
3 Introduction de configuration spécifique
Il y a des combinaisons de ces parties:
SRC: code Java, y compris intercepteur, appel d'appel, classe de test
src / cache Bean.xml: Configurez le haricot correspondant à ehcache, intercepteur et classes de test, etc.
src / ehcache.xml: Ehcache Cache Configuration Informations
Webroot / lib: bibliothèque
4 Introduction de contenu détaillé
4.1 SRC
4.1.1 Intercepteur
Deux intercepteurs sont d'abord configurés dans le code:
Le premier intercepteur est:
com.test.ehcache.cachemethodinterceptor
Le contenu est le suivant:
package com.test.ehcache; import java.io.serializable; import net.sf.ehcache.cache; import net.sf.ehcache.element; import org.aopalliance.intercept.methodInterceptor; import org.aopalliance.intercept.methodinvocation; import org.springframeworkwork.bans.factory.inites org.springframework.util.assesert; public class CacheMethodInterceptor implémente MethodInterceptor, InitializingBean {private cache cache; public void setCache (cache cache) {this.cache = cache; } public cacheMetHodInterceptor () {super (); } / ** * Interceptez la méthode ServiceManager et découvrez si le résultat existe. S'il existe, renvoyez la valeur dans le cache. * Sinon, renvoyez le résultat de la requête de la base de données et placez le résultat de la requête en cache * / public invoke (methodinvocation invocation) lève throwsable {// obtenez la chaîne de classe cibleName à intercepter = invocation.getThis (). GetClass (). GetName (); // Obtenez la méthode de la classe à intercepter la chaîne méthodyname = invocation.getMethod (). GetName (); // obtient les paramètres de la méthode de la classe à être interceptés par objet [] arguments = invocation.getArguments (); Résultat de l'objet; // Créez une chaîne pour créer la clé dans Cache String cacheKey = getCacheKey (TargetName, Methodname, Arguments); // Obtenez des données de Cache Element Element = Cache.get (CacheKey); if (élément == null) {// S'il n'y a pas de données dans le cache, recherchez la non-cache, comme la base de données, et placez celles trouvées dans le résultat du cache = invocation.proceed (); // Générez la clé et la valeur qui seront stockées dans l'élément Cache = nouvel élément (CacheKey, (Serializable) Result); System.out.println ("---- Entrez la recherche sans cache, comme la recherche directement de la base de données, la mettant dans le cache après la recherche"); // Stockez la clé et la valeur dans Cache Cache.put (élément); } else {// S'il y a des données dans le cache, recherchez le cache System.out.println ("--- entrez la recherche de cache, ne recherchez pas la base de données, soulant la pression sur la base de données"); } return element.getValue (); } / ** * Méthode pour obtenir la clé de cache. La clé de cache est l'identifiant unique d'un élément du cache. * Inclure le nom du package + Nom de classe + Nom de la méthode, tels que: com.test.service.testServiceIMPL.getObject * / private String getCacheKey (String TargetName, String MethodName, object [] arguments) {StringBuffer sb = new StringBuffer (); SB.APPEND (TargetNAME) .APPEND ("."). APPEND (MethodName); if ((arguments! = null) && (arguments.length! = 0)) {for (int i = 0; i <arguments.length; i ++) {sb.append ("."). APPEND (arguments [i]); }} return sb.toString (); } / ** * Implémentez InitializingBean, vérifiez si le cache est vide 70 * / public void AfterProperTiESSET () lève une exception {assert.notnull (cache, "Besoin d'un cache. Veuillez utiliser setCache (cache) le créer."); }}CacheMethodInterceptor est utilisé pour intercepter les méthodes à commencer par "Get". Notez que cet intercepteur intercepte d'abord, puis exécute l'interface d'appel d'origine.
Il y a aussi un intercepteur:
com.test.ehcache.cachafrAreTurningAdvice
Contenu spécifique:
package com.test.ehcache; importer java.lang.reflect.method; import java.util.list; import net.sf.ehcache.cache; import org.springframework.aop.afterreturningadvice; import org.springframework.beans.utilser; CACHAPHERATRERATURINGADVICE implémente après le remise des Advice, InitializingBean {private cache Cache; public void setCache (cache cache) {this.cache = cache; } public CachafrAreTurningAdvice () {super (); } public void afterreturning (objet arg0, méthode arg1, objet [] arg2, objet arg3) lance throwable {string className = arg3.getClass (). getName (); List list = cache.getKeys (); for (int i = 0; i <list.size (); i ++) {String cacheKey = string.valueof (list.get (i)); if (cacheKey.startswith (className)) {cache.Remove (cacheKey); System.out.println ("----- Clear Cache"); }}} public void afterpropertiesset () lève une exception {assert.notnull (cache, "besoin d'un cache. Veuillez utiliser setCache (cache) le créer."); }}CACHAPHERATRATRENTINGADADVICE est utilisé pour intercepter les méthodes en commençant par "Mise à jour". Notez que cet intercepteur exécute d'abord l'interface d'appel d'origine puis est interceptée.
4.1.2 Appeler l'interface
Le nom de l'interface est:
com.test.service.serviceManager
Le contenu spécifique est le suivant:
package com.test.service; import java.util.list; interface publique ServiceManager {public list getObject (); public void updateObject (objet objet); }Le nom de la classe d'implémentation est:
com.test.service.serviceManageRimpl
Le contenu spécifique est le suivant:
package com.test.service; import java.util.arraylist; import java.util.list; public class ServiceManagerimpl implémente ServiceManager {@Override public list getObject () {System.out.println ("---- ServiceManager: Cet élément n'existe pas dans le cache de cache, recherchez la données, et mettez-le dans le cache!"); retourner null; } @Override public void updateObject (objet objet) {System.out.println ("---- ServiceManager: l'objet est mis à jour, et tous les caches générées par cette classe seront supprimées!"); }}4.1.3 Classe de test
Le nom de la classe de test est:
com.test.service.testmain
Le contenu spécifique est:
package com.test.service; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationcontext; public class testmain {public static void main (string [] args) {string cachestring = "/cache-bean.xml";; ApplicationContext context = new ClassPathXmlApplicationContext (CacheString); // obtenez le haricot généré par le proxyfactoral d'usine proxy pour générer un effet d'effet d'interception ServiceManager TestService = (ServiceManager) context.getBean ("proxyfactory"); // la première fois recherchant System.out.println ("===== Première recherche"); TestService.getObject (); // la deuxième fois de recherche System.out.println ("===== deuxième recherche"); TestService.getObject (); // la deuxième fois de recherche System.out.println ("====== La troisième fois la recherche"); TestService.UpdateObject (null); // la troisième fois de recherche System.out.println ("====== La troisième fois la recherche"); TestService.getObject (); }}Notez ici que l'obtention de haricots est produite par la proxyfactive proxy d'usine, de sorte qu'il y aura un effet d'interception.
On peut voir que quatre appels sont définis dans la classe de test, et l'ordre d'exécution est:
Première recherche deuxième recherche première mise à jour troisième recherche
4.2 SRC / CACHE BEAN.XML
Cache Bean.xml est utilisé pour configurer les fèves correspondant à Ehcache, intercepteur et aux classes de test. Le contenu est le suivant:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Beans public "- // printemps // dtd bean // en" "http://www.springframework.org/dtd/spring-eans.dtd"> <fEAUX> <! name = "configLocation"> <value> ehcache.xml </value> </ propriété> </ank> <! - Définissez l'usine d'Ehcache et définissez le nom du cache utilisé, c'est-à-dire "com.tt" -> <bean id = "ehcache"> <propriété name = "Cachemanager"> <ref local = "DefaultCacheManager" <propriété name = "cachename"> <value> com.tt </value> </prophed> </ank> <! - L'intercepteur pour la création de cache et de cache de requête -> <bean id = "cacheMethodInterceptor"> <propriété name = "cache"> <ref local = "ehcache" /> </preust> </ank> <! - L'intercepteur pour la mise à jour du cache et les dilans -> </pan> id = "cachefterreturningAdvice"> <propriété name = "cache"> <ref local = "ehcache" /> </ propriété> </ank> <! - Appelez l'interface, l'objet intercepté -> <bean id = "ServiceManager" /> <! - Insérez l'intercepteur pour confirmer quel intercepteur est appelé, le nom de la méthode et les caractéristiques de l'intercepteur intercepteur. com.test.ehcache.cacheMethodInterceptor -> <bean id = "cachepointcut"> <! - Ajouter une section, la section est la section qui est ajoutée après avoir exécuté la méthode d'impression -> <propriété name = "conseils"> <ref Local = "CacheMethodInterceptor" /> </ Property> <Property Name = "MatchyS" ##rs> <! - ##. Conformément au caractère précédent une ou plusieurs fois ### * signifie conforme au caractère précédent zéro ou à plusieurs fois ### / échapper à tout symbole utilisé dans l'expression régulière -> <! Interceptor Intercepting Method Name, etc., appelez l'interceptor com.test.ehcache.cachaferreturningAdvice -> <bean id = "CachepointCutAdvice"> <propriété name = "conseils"> <ref Local = "CACHEAFFERTRATRINGADVICE" /> </ Property> <propriété Name = "PatternS"> <sist> <! -. Méthode UpdateObject -> <value>. * Mise à jour. * </value> </sist> </ propriété> </ bean> <! - Agent Factory -> <bean id = "proxyfactory"> <! - Description Call Interface Name -> <propriété name = "Target"> <Ref local = "ServiceManager" /> </ Property> <! - Description Interceptor Bean Name -> <propriété Nom = "InterceptoraS"> <List> List> Interceptor Bean Name -> <propriété Nom = "InterceptoraS"> <List> List * <value> cachepointcut </value> <value> cachepointcutadvice </value> </sist> </ propriété> </bans>
Le contenu de chaque haricot a été commenté et noté que n'oubliez pas d'agent d'agent des haricots d'usine.
4.3 src / ehcache.xml
ehcache.xml stocke des informations détaillées sur la configuration du cache ehcache, comme suit:
<? xml version = "1.0" coding = "utf-8"?> <ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespaceschemalation = "http://ehcache.org/ehcache.xsd"> <! <diskstore path = "d: // temp // cache" /> <defaultCache maxElementsInMemory = "1000" eternal = "false" timetoidleseconds = "120" timetolivesEconds = "120" overflowtodisk = "true" /> <! - Définir l'information du fichier Cache, où "com.tt" est le nom du fichier cache - MaxElementsInMemory = "10000" Eternal = "FALSE" TIMETOIDLEDONDS = "300000" TIMETOLIVESECONDS = "600000" OverflowTodisk = "True" /> </ehcache>
Vous pouvez voir que l'emplacement de stockage du stockage mis en cache est défini sur "d: / temp / cache", et le nom du cache est défini sur "com.tt", comme indiqué sur la figure:
4.4 webroot / lib
Pour la bibliothèque Java requise, veuillez consulter l'image de la structure du système au début, omise ici.
5 test
Exécutez la classe de test et les résultats des tests sont les suivants:
Grâce aux résultats d'exécution, nous pouvons voir:
Une fois la première recherche interceptée, il est constaté qu'il s'agit de la première interception et que le cache n'a pas été mis en cache. Exécutez donc d'abord la classe d'interface d'origine pour faire en sorte que les données soient interrogées. Il peut être obtenu via une requête de base de données, puis générer le cache et mettre les données interrogées dans le cache.
Après l'interception de la deuxième recherche , il a été constaté que le cache existe déjà, de sorte que la classe d'interface d'origine n'est plus exécutée, c'est-à-dire que la base de données ne s'interroge plus et les données de requête sont directement obtenues via le cache. Bien sûr, c'est juste une simple impression ici.
Ensuite, il y a la première mise à jour . L'opération effectuée après avoir été interceptée est de stocker toutes les données du cache dans la base de données et de supprimer le cache.
Enfin, il y a la troisième requête . Après avoir été intercepté, il est constaté que le système n'a pas de cache, donc la base de données de requête de classe d'interface d'origine, crée un cache et mettez les données obtenues à partir de la nouvelle requête dans le cache. La même méthode que la première requête.
Jusqu'à présent, nous avons mis en œuvre ce qui doit être fait par printemps avec ehcache.
6 code source de pièce jointe
Le code source de la pièce jointe peut être obtenu à partir de mon site Web GitHub.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.