1 Ehcache 소개
Ehcache는 빠르고 마른 기능을 갖춘 순수한 Java 상업용 캐싱 프레임 워크이며 최대 절전 모드의 기본 Cacheprovider입니다.
Ehcache는 널리 사용되는 오픈 소스 Java 분산 캐시입니다. 주로 Universal Cache, Java EE 및 경량 용기를 목표로합니다. 메모리 및 디스크 스토리지, 캐시 로더, 캐시 확장, 캐시 예외 처리기, GZIP 캐시 서블릿 필터의 기능이 있으며 REST 및 SOAP API를 지원합니다.
Ehcache는 원래 2003 년 Greg Luck에 의해 개발되었습니다. 2009 년 에이 프로젝트는 Terracotta에서 구매했습니다. 이 소프트웨어는 여전히 오픈 소스이지만 Enterprise Ehcache 및 BigMemory와 같은 상용 제품에서만 새로운 주요 기능 (예 : 빠른 재시작 성 간의 일관성)은 사용할 수 있습니다. Wikimedia FoundationAnounnouncomed는 현재 Ehcache 기술을 사용하고 있습니다.
요컨대, Ehcache는 여전히 우수한 캐싱 기술입니다. ehcache로 스프링이 어떻게 구현되는지 살펴 보겠습니다.
2 스프링 ehcache
시스템 결과는 다음과 같습니다.
3 특정 구성 소개
이 부분의 조합이 있습니다.
SRC : 인터셉터, 인터페이스 호출, 테스트 클래스를 포함한 Java 코드
src/cache-bean.xml : ehcache, 인터셉터 및 테스트 클래스에 해당하는 Bean을 구성하십시오.
src/ehcache.xml : ehcache 캐시 구성 정보
Webroot/Lib : 도서관
4 자세한 내용 소개
4.1 SRC
4.1.1 인터셉터
두 인터셉터가 코드에서 먼저 구성됩니다.
첫 번째 인터셉터는 다음과 같습니다.
com.test.ehcache.cachemethodinterceptor
내용은 다음과 같습니다.
패키지 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 org.springpringwork.bean org.springframework.util.assert; public class cachemethodinterceptor implements methodinterceptor, 초기화 {개인 캐시 캐시; public void setcache (캐시 캐시) {this.cache = 캐시; } public cachemethodinterceptor () {super (); } /*** ServiceManager 메소드를 가로 채서 결과가 존재하는지 확인하십시오. 존재하면 캐시의 값을 반환하십시오. * 그렇지 않으면 데이터베이스 쿼리 결과를 반환하고 쿼리 결과를 캐시에 넣습니다. */public 객체 호출 (MethodInvocation envocation) 던지기 가능 {// 클래스 문자열 targetName을 intercepted.getThis (). getClass (). getName (); // 클래스의 메소드를 가로 채기로 가져옵니다. String MethodName = invocation.getMethod (). getName (); // 클래스 메소드의 매개 변수를 가로 채기 위해 객체를 가리 킵니다. 객체 결과; // 캐시 문자열에서 키를 만들기 위해 문자열을 만듭니다. cachekey = getCachekey (targetName, MethodName, Arguments); // 캐시 요소에서 데이터를 가져옵니다. 요소 요소 = cache.get (cachekey); if (element == null) {// 캐시에 데이터가없는 경우 데이터베이스와 같은 비 캐시를 찾아서 찾은 것과 캐시 result = invocation.proceed ()에 넣습니다. // 캐시 요소 = 새 요소 (CacheKey, (Serializable) 결과)에 저장 될 키와 값을 생성합니다. System.out.println ( "---- 데이터베이스 검색과 같은 비 캐시 검색을 입력하고 검색 후 캐시에 넣습니다"); // 키와 값을 캐시 캐시에 저장합니다. } else {// 캐시에 데이터가있는 경우 Cache System.out.println을 찾으십시오 ( "--- 캐시 검색을 입력하고 데이터베이스를 찾지 말고 데이터베이스의 압력을 완화하십시오"); } return emelt.getValue (); } /*** 캐시 키를 얻는 메소드. 캐시 키는 캐시에서 요소의 고유 식별자입니다. * 패키지 이름 + 클래스 이름 + 메소드 이름 포함 : 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 (); } / ** * 초기화 비대 구현, 캐시가 비어 있는지 확인하십시오. }}Cachemethodinterceptor는 "get"으로 시작하는 방법을 가로 채는 데 사용됩니다. 이 인터셉터는 먼저 인터셉트를 한 다음 원래 통화 인터페이스를 실행합니다.
인터셉터도 있습니다.
com.test.ehcache.cacheadterturningAdvice
특정 내용 :
패키지 com.test.ehcache; import java.lang.reflect.method; import java.util.list; import net.sf.ehcache.cache; import org.springframework.aop.apterreturningAdvice; import org.springframework.beans.initializingbean; import org.sprameaster CACHETERTERNINGADVICE는 후에 재림 한 후 {private cache cache; public void setcache (캐시 캐시) {this.cache = 캐시; } public cacheterreturningAdvice () {super (); } public void After -RETERNING (Object Arg0, Method Arg1, Object [] arg2, Object Arg3) 던지기 가능 {String className = arg3.getClass (). getName (); 목록 목록 = 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 ()는 예외를 던져 {assert.notnull (캐시, 캐시가 필요합니다. setCache (캐시)를 사용하십시오. "); }}CACHETERTERNINGIDVICE는 "업데이트"로 시작하는 메소드를 가로 채는 데 사용됩니다. 이 인터셉터는 먼저 원래 통화 인터페이스를 실행 한 다음 차단됩니다.
4.1.2 인터페이스를 호출합니다
인터페이스 이름은 다음과 같습니다.
com.test.service.servicemanager
특정 내용은 다음과 같습니다.
package com.test.service; import java.util.list; public interface servicemanager {public list getObject (); public void updateObject (객체 개체); }구현 클래스 이름은 다음과 같습니다.
com.test.service.servicemanagerimpl
특정 내용은 다음과 같습니다.
패키지 com.test.service; import java.util.arraylist; import java.util.list; public class servicemanagerimpl은 servicemanager {@override public list getObject () {system.out.println ( "---- Servicemanager :이 요소가 캐시 캐시에 존재하지 않는다"); 널 리턴; } @Override public void updateObject (Object Object) {System.out.println ( "---- ServiceManager : 객체가 업데이트 되고이 클래스에서 생성 된 모든 캐시가 제거됩니다!"); }}4.1.3 테스트 클래스
테스트 클래스 이름은 다음과 같습니다.
com.test.service.testmain
특정 내용은 다음과 같습니다.
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 (캐시 스트링); // 프록시 팩토리 프록시로 생성 된 Bean을 가져와 인터 셉션 효과 ServiceManager testservice = (ServiceManager) context.getBean ( "proxyFactory"); // System.out.println을 처음으로 검색 할 때 ( "===== First Search"); testservice.getObject (); // 두 번째로 System.out.println ( "===== Second Search"); testservice.getObject (); // 두 번째로 System.out.println을 검색합니다 ( "====== 세 번째 검색"); testservice.updateobject (null); // System.out.println을 세 번째로 검색합니다 ( "====== 세 번째 검색"); testservice.getObject (); }}여기서 콩을 얻는 것은 프록시 팩토리에 의해 생성되므로 가로 채기 효과가 생깁니다.
테스트 클래스에서 4 개의 통화가 설정되어 있으며 실행 순서는 다음과 같습니다.
첫 번째 조회 둘째 조회 첫 번째 업데이트 세 번째 조회
4.2 SRC/CACHE-BEAN.XML
Cache-Bean.xml은 Ehcache, 인터셉터 및 테스트 클래스에 해당하는 Bean을 구성하는 데 사용됩니다. 내용은 다음과 같습니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype beans public "-// spring // dtd bean // en" "http://www.spramframework.org/dtd/spring-beans.dtd"> <beans> <!-ehcache의 구성-<id id <id id <id id <id <id <id <id <id <id <id <id <id <id <id <id <id <id <id <id <id < 이름 = "configlocation"> <aluge> value> ehcache.xml </value> </property> </bean> <!-ehcache의 공장을 정의하고 사용 된 캐시의 이름을 정의하고 "com.tt"-> <bean id = "ehcache"> <property name = "cachemanager "> <"defaultCememanager "/>>/>>의 이름을 설정합니다. <속성 이름 = "Cachename"> <alue> com.tt </value> </property> </bean> <!-캐시 및 쿼리 캐시 생성을위한 인터셉터-> <bean id = "cachemethodinterceptor"> <property name = "cache"> <Ref local = "ehcache"/> </property> </bean> <! id = "캐시 후 트리 닝 닝 바이스"> <속성 이름 = "캐시"> <Ref local = "ehcache" /> < /propert> < /bean> <!-인터셉트 된 객체를 호출하십시오-> <bean id = "servicemanager" /> <!-여기에 어떤 인터셉터를 삽입하여, 여기에 인터셉터의 메소드 이름과 특성이 상쇄되어 있습니다. com.test.ehcache.cachemethodinterceptor-> <bean id = "cachepointcut"> <!-섹션을 추가하십시오. 섹션은 인쇄 방법을 실행 한 후 추가 된 섹션입니다-> <속성 이름 = "조언"> <ref local = "cachemethod interceptor" /> < /propertion name = "patterns"> <!- 이전 문자를 한 번 또는 여러 번 준수하는 것은 이전 문자 0 또는 여러 번 ###/탈출을 의미하는 것을 의미합니다. 정규 표현식에 사용 된 모든 기호-> <!-.* 이전 접두사 (패키지 이름 포함)를 의미합니다. 즉, getObject 메소드-> <value>. 인터셉터 차단 메소드 이름 등, 인터셉터 com.test.ehcache.cachecde atrereturningAdvice-> <bean id = "cachepointcutadvice"> <property name = "jocne"> <ref local = "cachepterreturningAdvice" /> < /production name> <property name = "patterns"> <!-* propopix를 포함합니다. 메소드-> <value>.*update.*</value> </list> </property> </bean> <!-에이전트 팩토리-> <bean id = "proxyFactory"> <! <!-설명 인터페이스 빈 이름-> <속성 이름 = "target"> <Ref local = "serviceManager"/> </product> <!-interceptor bean name = "interceptame"> <value> CachePointCut </value> <alue> CachePointCutAdvice </value> </list> </property> </beans>
각 콩의 내용물은 댓글을 달았으며 공장 콩 에이전트를 잊지 않는 것으로 나타났습니다.
4.3 src/ehcache.xml
ehcache.xml은 다음과 같이 Ehcache 캐시 구성에 대한 자세한 정보를 저장합니다.
<? xml version = "1.0"encoding = "utf-8"?> <ehcache xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance"xsi : nonamespaceschemalocation = "http://ehcache.org/ehcache.xsd"> <! <diskstore path = "d : // temp // cache"/> <defaultCache maxelementsInmemory = "1000"Eternal = "false"timetoidleseconds = "120"timetoliveseconds = "120"OverFlowTodisk = "true"/> <!-"come", com.tt "는 cache의 이름입니다. MaxelementsInMemory = "10000"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을 더 지원하기를 바랍니다.