1 Введение в ehcache
Ehcache-это чистая рамка кэширования Java-процесса, с быстрыми и худыми функциями, и это кахэпровидер по умолчанию в Hibernate.
EHCache - широко используемый кэш с открытым исходным кодом Java. В основном нацелены на универсальный кеш, Java EE и легкие контейнеры. Он имеет функции памяти и дискового хранилища, загрузку кеша, расширения кэша, обработчика исключений кэша, сервопривода кэша GZIP, а также поддерживает API и API SOAP.
Ehcache был первоначально разработан Грегом Лак в 2003 году. В 2009 году проект был приобретен Terracotta. Программное обеспечение по -прежнему остается с открытым исходным кодом, но некоторые новые основные функции (например, последовательность между быстрого перезагрузки) могут использоваться только в коммерческих продуктах, таких как Enterprise Ehcache и BigMemory. Wikimedia FoundationAnnounced в настоящее время использует технологию Ehcache.
Короче говоря, Ehcache все еще является хорошей технологией кэширования. Давайте посмотрим, как Spring реализована с помощью ehcache.
2 пружина с эхкаче
Результаты системы следующие:
3 конкретная конфигурация введения
Есть комбинации этих частей:
SRC: код Java, включая Interceptor, вызов интерфейса, класс тестирования
src/cache-bean.xml: настройка боба, соответствующего Ehcache, Interceptor и тестовых классам и т. Д.
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; импорт net.sf.ehcache.element; импорт org.aopalliance.intercept.methodinterceptor; import.aopalliance.intercept.methodinvocation; импорт. org.springframework.util.assert; открытый класс Cachemethodinterceptor реализует Methodinterceptor, инициализируемый bean {private Cache Cache; public void setCache (Cache Cache) {this.cache = cache; } public cachemethodinterceptor () {super (); } /*** Перехватить метод ServiceManager и выясните, существует ли результат. Если он существует, верните значение в кэше. * В противном случае вернуть результат запроса базы данных и поместить результат запроса в кэш */public Object Invoke (MethodInvocation Invocation) Throws {// Получить строку класса TargetName, чтобы быть перехваченным = vocation.getThis (). GetClass (). GetName (); // Получить метод класса, чтобы быть перехваченным string methodname = vocation.getmethod (). GetName (); // Получить параметры метода класса, чтобы быть перехваченным объектом [] arguments = vocation.getArguments (); Объект результат; // Создать строку для создания ключа в кэш -string cachekey = getCachekey (TargetName, MethodName, Arguments); // Получить данные из элемента элемента кэша = cache.get (cachekey); if (element == null) {// Если в кэше нет данных, ищите не кэш, такие как база данных, и поместите найденные в кэш result = vlocation.proceed (); // генерировать ключ и значение, которые будут сохранены в элементе кэша = новый элемент (CacheKey, (Serializable) Result); System.out.println ("---- Введите поиск без кэша, такой как поиск базы данных напрямую, вкладывая ее в кэш после поиска"); // хранить ключ и значение в cache cache.put (element); } else {// Если есть данные в кэше, ищите cache System.out.println ("--- Введите поиск в кэше, не ищите базу данных, облегчая давление на базу данных"); } return element.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 ((аргументы! = null) && (arguments.length! = 0)) {for (int i = 0; i <arguments.length; i ++) {sb.append ("."). Append (Arguments [i]); }} return sb.toString (); } / ** * Реализовать инициализацию, проверьте, является ли кэш пустым 70 * / public void Afterpropertiesset (), который вызывает exection {assert.notnull (кэш, «нужен кэш. Пожалуйста, используйте SetCache (Cache) создайте его.»); }}Cachemethodinterceptor используется для перехвата методов, начиная с «Get». Обратите внимание, что этот перехватчик сначала перехватывает, а затем выполняет исходный интерфейс вызова.
Есть также перехватчик:
com.test.ehcache.cacheafterReturningAdvice
Конкретный контент:
Пакет com.test.ehcache; импорт java.lang.reflect.method; import java.util.list; import net.sf.ehcache.cache; импорт org.springframework.aop.afterReturningAdvice; импорт org.sprimework.beansFortory.publicalizingbeanbean; CacheafterReturningAdvice реализует после повторного возврата, инициализация Bean {Private Cache Cache; public void setCache (Cache Cache) {this.cache = cache; } public cachefterReturningAdvice () {super (); } public void после повторного повторного (Object arg0, method arg1, object [] arg2, object arg3) бросает Throwable {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 () Throws Exception {assert.notnull (кэш, «нужен кэш. Пожалуйста, используйте SetCache (Cache) Создайте его.»); }}CachefterReturningAdvice используется для перехвата методов, начиная с «обновления». Обратите внимание, что этот перехватчик сначала выполняет исходный интерфейс вызова, а затем перехвачен.
4.1.2 Вызов интерфейса
Имя интерфейса:
com.test.service.servicemanager
Конкретный контент заключается в следующем:
пакет com.test.service; import java.util.list; public interface servicemanager {public list getObject (); public void updateObject (объект объекта); }Имя класса реализации:
com.test.service.servicemanagerimpl
Конкретный контент заключается в следующем:
пакет com.test.service; импорт java.util.arraylist; import java.util.list; открытый класс ServiceManagerImpl реализует ServiceManager {@Override public list getObject () {System.out.println ("---- ServiceManager: этот элемент не существует в кеш-кехе, поиск Databae и It It to Cache! вернуть ноль; } @Override public void updateObject (Object Object) {System.out.println ("---- ServiceManager: объект обновляется, и все кэши, сгенерированные этим классом, будут удалены!"); }}4.1.3 Тестовый класс
Название тестового класса:
com.test.service.testmain
Конкретный контент:
пакет 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); // Получение бобов, сгенерированного прокси -заводской проксифакторией для создания эффекта перехвата ServiceManager TestService = (ServiceManager) Context.getBean ("ProxyFactory"); // первый раз поиск system.out.println ("===== Первый поиск"); testservice.getObject (); // второй раз поиск System.out.println ("===== Второй поиск"); testservice.getObject (); // Второй раз поиск system.out.println ("====== В третий раз поиск"); testservice.updateObject (null); // третий раз поиск system.out.println ("====== В третий раз поиск"); testservice.getObject (); }}Обратите внимание, что получение бобов производится прокси -фабрикой ProxyFactory, так что будет эффект перехвата.
Можно видеть, что четыре вызова установлены в тестовом классе, а заказ на выполнение:
Первый поиск второй поиск первого обновления третья поиск
4.2 src/cache-bean.xml
Cache-bean.xml используется для настройки бобов, соответствующих классам Ehcache, Interceptor и тестирования. Содержание следующим образом:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Beans public "-// Spring // dtd bean // en" "http://www.springframework.org/dtd/spring-beans.dtd"> <Beans> <! <name = "configlocation"> <datue> ehcache.xml </value> </property> </bean> <!-Определите фабрику ehcache и установите имя используемого кэша, то есть "com.tt"-> <bean id = "ehcache"> <proport name = "cachemanager"> <fer local = "defaulcemanage"/</name <//name <//name <//name <//mehing> </mehale '> </feelcemanager "/> <facemanage'> <fecemangemanage"/"/"/"/"/"/"/"/"/"? Cache-> <name = name = "cachename"> <value> com.tt </value> </property> </bean> <!-перехватчик для создания кэша и кэша запросов-> <bean id = "cachemethodinterceptor"> <pertive = "cache"> <ref local = "ehcache"/> </properation> </bean> <! Cache-> <Bean id = "cacheaifterterurningAdvice"> <name = "cache"> <ref local = "ehcache" /> < /propetion> < /bean> <!-вызовите интерфейс, перехваченный объект-> <Bean Id = "ServiceManager" /> <! Interceptor здесь com.test.ehcache.cachemethodinterceptor-> <bean id = "cachepointcut"> <!-Добавить раздел, раздел-это раздел, который добавляется после выполнения метода печати-> <property name = "Консультации"> <ref local = "cachemethodinterceptor" /> < /> properate> <property = "> <siled> <! символ ### + означает соответствие предыдущему символу один или несколько раз ###** означает соответствие предыдущему ноль символа или несколько раз ###/recape Любой символ, используемый в регулярном выражении-> <!-.* означает предыдущий префикс (включая имя пакета), что означает метод GetObject->. Название метода и характеристики Имя метода перехвата перехвата и т. Д., Вызовите Interceptor com.test.ehcache.cacheafterReturningAdvice-> <bean id = "cachepointcutadvice"> <собственность = "Консультации"> <ref ref local = "cachefterreturningadvice" /> < /property name name = "prese"> <lecturer xhiperurnvice " /> < /property name =" presix> <ceist> <cepater xyfer olfer stiffice " /> < /property name =". Имя), что означает метод UpdateObject-> <dulch>.*Update.*</value> </list> </property> </bean> <!-Agent Factory-> <Bean Id = "ProxyFactory"> <!-Описание Interface Interface Bean name-> <name = "target"> <ref local = "ServiceManager"/> </Propecty> <!-Описание. <sist> <datter> cachepointcut </value> <dall> 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.> <diskstore path = "d: // temp // cache"/> <defaultCache maxelementsinmemory = "1000" eternal = "false" timeDoidLeseconds = "120" Timetoliveseconds = "120" OverflowTodisk = "true"/> <! name = "com.tt" 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 больше.