SpringキャッシングとEhcacheの例
このチュートリアルでは、Springアプリケーションでデータキャッシュを有効にし、一般的なhttp://ehcache.org/[Ehcache]フレームワークと統合する方法を説明します。
使用されるツール
-
Ehcache 2.9
-
Spring 4.1.4.RELEASE
-
ログバック1.0.13
-
Maven 3/Gradle 2
-
JDK 1.7
-
Eclipse 4.4
1.プロジェクトのディレクトリ構造
プロジェクトの依存関係
Springキャッシングは
spring-context.jar`にあり、Ehcacheキャッシングをサポートするために
spring-context-support.jar`も含める必要があります。
Mavenプロジェクトの場合:
pom.xml
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.0</version> </dependency> <!-- Optional, to log stuff --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> </dependency> <!-- Spring caching framework inside this --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.4.RELEASE</version> </dependency> <!-- Support for Ehcache and others --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.4.RELEASE</version> </dependency> </project>
Gradleプロジェクトの場合:
gradle.build
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非キャッシュの例
監督名で映画を探す簡単なDAO。
Movie.java
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() }
MovieDao.java
package com.mkyong.movie; public interface MovieDao{ Movie findByDirector(String name); }
MovieDaoImpl.java
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); } } }
AppConfig.java
package com.mkyong.test; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan({ "com.mkyong.** " }) public class AppConfig { }
App.java
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].... `findByDirector`を呼び出すたびに2秒の遅延があります。 === 4. Springキャッシングの例+ EhCache 今度は、メソッド `findByDirector`でデータキャッシングを有効にします。 4.1 ehcache.xmlファイルを作成し、Ehcacheにデータのキャッシュ方法と場所を伝えます。 src/main/resource/ehcache.xml
<ehcache xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=”ehcache.xsd”
updateCheck=”true”
monitoring=”autodetect”
dynamicConfig=”true”>
<diskStore path="java.io.tmpdir"/>
<cache name="movieFindCache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="false" diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> <persistence strategy="localTempSwap"/> </cache>
</ehcache>
** Note ** + Ehcacheの設定方法については、公式のhttp://ehcache.org/ehcache.xml[ehcache.xml]の例を参照してください。 4.2キャッシュするメソッドに `@ Cacheable`を追加します。 MovieDaoImpl.java
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`でキャッシングを有効にし、` EhCacheCacheManager`を宣言しました。 AppConfig.java
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 Web以外のアプリケーションでは、Springコンテキストを手動でシャットダウンする必要があり、Ehcacheもシャットダウンする可能性があります。それ以外の場合はEhcacheマネージャがハングします。 App.java
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
実行時間を見直し、遅れはない。さらに、このメソッドは一度しか実行されず、後続の呼び出しでオブジェクトがキャッシュから取得されるため、findByDirectorが実行されているのは1つだけです。 完了しました。 ** Spring Cacheの詳細** この記事は、Springデータキャッシングを始め、 `@ CacheEvict`、` @ CachePut`、 `@ CacheConfig`などの他のキャッシングアノテーションの詳細を学ぶのに役立ちます。この公式http ://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html[Spring Cache Abstractionのドキュメント]、かなり詳細です。 === ソースコードをダウンロードする ダウンロードする - link://wp-content/uploads/2015/01/Spring-Ehcache-Example.zip[Spring-Ehcache-Example.zip](20 KB) === 参考文献 . http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html[Spring キャッシュ抽象化]。リンク://ehcache/ehcache-hello-world-example/[Ehcache Hello World 例]。 http://ehcache.org/ehcache.xml[ehcache.xmlの例] . link://spring3/spring-3-javaconfig-example/[Spring 3 Javaの設定 例] link://tag/ehcache/[ehcache]link://タグ/spring/[spring]