Рубрики
Без рубрики

Пример весеннего кэширования и Ehcache

– Весеннее кэширование и пример Ehcache

Автор оригинала: mkyong.

В этом уроке мы покажем вам, как включить кэширование данных в приложении Spring и интегрироваться с популярной платформой Ehcache .

Используемые инструменты

  1. Ehcache 2.9
  2. Пружина 4.1.4.ВЫПУСК
  3. Обратный вход 1.0.13
  4. Maven 3/Gradle 2
  5. JDK 1.7
  6. Затмение 4.4

1. Структура каталогов проектов

2. Зависимости проекта

Весеннее кэширование находится в spring-context.jar , для поддержки кэширования Ehcache вам необходимо включить spring-context-support.jar также.

Для проекта Maven:

	
		net.sf.ehcache
		ehcache
		2.9.0
	

        
	
		ch.qos.logback
		logback-classic
		1.0.13
	

	
	
		org.springframework
		spring-context
		4.1.4.RELEASE
	

	
	
		org.springframework
		spring-context-support
		4.1.4.RELEASE
	

Для проекта Gradle:

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
 
version = '1.0'

// Uses JDK 7
sourceCompatibility = 1.7
targetCompatibility = 1.7

// Get dependencies from Maven central repository
repositories {
	mavenCentral()
}

//Project dependencies
dependencies {
	compile 'org.springframework:spring-context:4.1.4.RELEASE'
	compile 'org.springframework:spring-context-support:4.1.4.RELEASE'
	compile 'net.sf.ehcache:ehcache:2.9.0'
	compile 'ch.qos.logback:logback-classic:1.0.13'
}

3. Пример без кэширования Spring

Простой способ найти фильм по имени режиссера.

package com.mkyong.movie;

import java.io.Serializable;

public class Movie implements Serializable {

	int id;
	String name;
	String directory;

	//getters and setters
	//constructor with fields
	//toString()
}
package com.mkyong.movie;

public interface MovieDao{
	
	Movie findByDirector(String name);
	
}
package com.mkyong.movie;

import org.springframework.stereotype.Repository;

@Repository("movieDao")
public class MovieDaoImpl implements MovieDao{

	//each call will delay 2 seconds, simulate the slow query call
	public Movie findByDirector(String name) {
		slowQuery(2000L);
		System.out.println("findByDirector is running...");
		return new Movie(1,"Forrest Gump","Robert Zemeckis");
	}
	
	private void slowQuery(long seconds){
	    try {
                Thread.sleep(seconds);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
	}
	
}
package com.mkyong.test;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan({ "com.mkyong.*" })
public class AppConfig {	
}
package com.mkyong.test;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.mkyong.movie.MovieDao;

public class App {
	
	private static final Logger log = LoggerFactory.getLogger(App.class);
	
	public static void main(String[] args) {
     
	    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
	    MovieDao obj = (MovieDao) context.getBean("movieDao");
	    
	    log.debug("Result : {}", obj.findByDirector("dummy"));
	    log.debug("Result : {}", obj.findByDirector("dummy"));
	    log.debug("Result : {}", obj.findByDirector("dummy"));
	    
	}
}

Выход

findByDirector is running...
2015-01-22 10:39:04 [main] DEBUG com.mkyong.test.App - Result : Movie [id=1, name=Forrest Gump, directory=Robert Zemeckis]
findByDirector is running...
2015-01-22 10:39:06 [main] DEBUG com.mkyong.test.App - Result : Movie [id=1, name=Forrest Gump, directory=Robert Zemeckis]
findByDirector is running...
2015-01-22 10:39:08 [main] DEBUG com.mkyong.test.App - Result : Movie [id=1, name=Forrest Gump, directory=Robert Zemeckis]

Каждый вызов найти директором займет 2 секунды задержки.

4. Пример весеннего кэширования + EhCache

Теперь мы включим кэширование данных в методе |/найти По Директору .

4.1 Создайте ehcache.xml файл, чтобы указать Ehcache, как и где кэшировать данные.



	
	
	
		
	


4.2 Добавьте @Cacheable в метод, который вы хотите кэшировать.

package com.mkyong.movie;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;

@Repository("movieDao")
public class MovieDaoImpl implements MovieDao{

	//This "movieFindCache" is delcares in ehcache.xml
	@Cacheable(value="movieFindCache", key="#name")
	public Movie findByDirector(String name) {
		slowQuery(2000L);
		System.out.println("findByDirector is running...");
		return new Movie(1,"Forrest Gump","Robert Zemeckis");
	}
	
	private void slowQuery(long seconds){
	    try {
                Thread.sleep(seconds);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
	}
	
}

4.3 Включите кэширование с помощью @EnableCaching и объявите Менеджер кэша EhCache .

package com.mkyong.test;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

@Configuration
@EnableCaching
@ComponentScan({ "com.mkyong.*" })
public class AppConfig {

	@Bean
	public CacheManager cacheManager() {
		return new EhCacheCacheManager(ehCacheCacheManager().getObject());
	}

	@Bean
	public EhCacheManagerFactoryBean ehCacheCacheManager() {
		EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
		cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
		cmfb.setShared(true);
		return cmfb;
	}
}

4.4 В не-веб-приложении вам необходимо вручную отключить контекст Spring, чтобы у Ehcache также была возможность завершить работу, иначе менеджер Ehcache зависнет там.

package com.mkyong.test;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.mkyong.movie.MovieDao;

public class App {
	
	private static final Logger log = LoggerFactory.getLogger(App.class);
	
	public static void main(String[] args) {
     
	    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
	    MovieDao obj = (MovieDao) context.getBean("movieDao");
	    
	    log.debug("Result : {}", obj.findByDirector("dummy"));
	    log.debug("Result : {}", obj.findByDirector("dummy"));
	    log.debug("Result : {}", obj.findByDirector("dummy"));
	    
	    //shut down the Spring context.
	    ((ConfigurableApplicationContext)context).close();
	    
	}
}

Выход

INFO: Initializing EhCache CacheManager

findByDirector is running...
2015-01-22 10:53:28 [main] DEBUG com.mkyong.test.App - Result : Movie [id=1, name=Forrest Gump, directory=Robert Zemeckis]
2015-01-22 10:53:28 [main] DEBUG com.mkyong.test.App - Result : Movie [id=1, name=Forrest Gump, directory=Robert Zemeckis]
2015-01-22 10:53:28 [main] DEBUG com.mkyong.test.App - Result : Movie [id=1, name=Forrest Gump, directory=Robert Zemeckis]

INFO: Shutting down EhCache CacheManager

Проверьте время выполнения, задержки нет. Кроме того, выводится только одно “поиск по директору выполняется…”, поскольку этот метод выполняется только один раз, последующий вызов получит объект из кэша.

Сделано.

Скачать Исходный Код

Рекомендации

  1. Абстракция весеннего кэша
  2. Ehcache Привет, Мир Пример
  3. ehcache.xml примеры
  4. Весна 3 Пример конфигурации Java

Оригинал: “https://mkyong.com/spring/spring-caching-and-ehcache-example/”