Skip to main content

Hướng dẫn Spring Caching kết hợp Ehcache


Bài viết này hướng dẫn cơ bản để làm data caching với Spring framework kết hợp với một framework phổ biến về caching là Ehchache. Thực ra thì Spring tự bản thân nó đã hổ trợ caching nhưng Ehcache framework cung cấp thêm một số tùy chỉnh như thời gian hết hạn (thời gian remove khỏi bộ nhớ cache).

  • Ehcache 2.9
  • Spring 4.2.7.RELEASE
  • Maven 3
  • JDK 1.8
  • Spring tool suite/Eclipse

  1. Thư viện hỗ trợ

Thu viện hỗ trợ cho caching của Spring là spring-context.jar; để Spring hỗ trợ cho Ehcache caching cần thêm thư viện spring-context-support.jar.

pom.xml

 <dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>2.9.0</version>
   </dependency>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>4.2.7.RELEASE</version>
   </dependency>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.2.7.RELEASE</version>
   </dependency>


2. Cấu hình
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
   <cache:annotation-driven />
   //your beans
</beans>

Hoặc bạn có thể sử dụng annotation @EnableCaching trong class config.

AppConfig.java

@EnableCaching
@Configuration
@ComponentScan(basePackages = "com.itphuongha.example")
@PropertySource(value = {"classpath:application.properties"})
@EnableScheduling
public class AppConfig {
  private final Logger log = LoggerFactory.getLogger(AppConfig.class);
  private net.sf.ehcache.CacheManager cacheManager; 




  @Bean
  public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
  }

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

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

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" name="CM1" updateCheck="false" maxBytesLocalHeap="16M"> <!-- This is a default configuration, it is re-configured by the CacheConfiguration Spring Bean, using the properties from the resources/config/*.yml files. --> <diskStore path="java.io.tmpdir" /> <cache name="token" timeToLiveSeconds="5" /> </ehcache>
  • timeToLiveSeconds: thời gian tối đa (tính theo giây) mà một đối tượng tồn tại trong cache bất kể nó có được gọi tới hay không. Ví dụ: đối tượng được tạo lúc 07:00:00; và nó sẽ được remove khỏi cache lúc 07:00:05, bất kể có hay không.
  • timeToIdleSeconds: thời gian tối đa (tính theo giây) mà một đối tượng tồn tại trong cache kể từ thời điểm cuối cùng nó được gọi hay sử dụng. Ví dụ: đối tượng được tạo lúc 07:00:00; lần cuối cùng nó được gọi truy cập tới là 08:00:00 sau 5s nếu không có truy cập khác thì sẽ được remove khỏi cache lúc 08:00:05.
3. @Cacheable 
Method với annotation @Cacheable thì khi nó được gọi nếu trong bộ nhớ cache có tồi tại giá trị tương ứng thì giá trị này được trả về mà không cần execute method; ngược lại thì execute nội dung method sau đó trả về kết quả đồng thời lưu giá trị đó vào bộ nhớ cache.
public class CachingDemo implements ICachingDemo {
 @Autowired
 private Environment environment;
 private static final JSONParser parser = new JSONParser();
 @Override
 @Cacheable(value = "token", unless = "#result == null")
 public String getToken() {
  // get from other system, API
  return token;
 }



4. Interface cho class caching class 
Như ở bước 3 class đang implement một interface. Đây là điểm mấu chốt quan trọng của caching, nếu không có interface thì cache sẽ không work. Mình đã gặp phải lỗi này nên hi vọng mọi người sẽ không bị.
public interface ICachingDemo {
 
 String getToken();
 
}

Phuong Ha

Comments

Post a Comment

Popular posts from this blog

Sức khỏe - Chúng Ta Cần Tránh Một Vài Loại Thực Phẩm?           Trong lý thuyết thực dưỡng và trong danh sách các thực phẩm cần tránh -  Foods to  Avoid List  trích theo  Macrobiotics America  mục  Getting Started , bạn sẽ được khuyên nên tránh một số loại thực phẩm theo quan điểm thực dưỡng. Trong số chúng sẽ có một số thực phẩm thường được gắn mác là thực phẩm nhiên nhiên, một dạng thực phẩm "healthy". Ví dụ như sữa đậu nành và nhiều thực phẩm khác.          Điều quan trọng để hiểu được thực dưỡng, chúng ta không chỉ xem xét theo quan điểm của dinh dưỡng hiện đại bao gồm "chất đạm, chất béo, tinh bột, vitamin và khoáng chất" mà còn theo những hiểu biết truyền thống về mỗi loại thực phẩm có một năng lượng đặc trưng. Thực dưỡng nhấn mạnh vào khía cạnh "năng lượng" hay "dinh dưỡng vô hình" của thức ăn - khái niệm mà tôi thường dùng. Chúng ta không thể định lượng hay định tính khái niệm này thông kín...

Du lịch Hàn Quốc tự túc - Cách đi từ các sân bay Hàn Quốc về Seoul

Cách đi từ các sân bay quốc tế phổ biến ở Hàn Quốc về Seoul. Có rất nhiều page nói về vấn đề này, ở đây mình chỉ chia sẻ kinh nghiệm của mình. Có 2 sân bay gần Seoul đó là sân bay quốc tế Incheon & sân bay quốc tế Gimpo. * Sân bay Quốc tế Incheon cách Seoul khoảng hơn 50 cây số, do đó di chuyển từ đây về kiểu gì cũng sẽ mất chừng 45 phút là ít nhất. Thông thường từ Việt Nam sang Hàn Quốc, các bạn sẽ đáp tại sân bay Incheon. * Sân bay Quốc tế Gimpo cách Seoul 30 phút chạy xe. Thường các bạn muốn bay từ Seoul đi Jeju hay Busan & ngược lại sẽ bay tại sân bay này. AREX: Tàu Arex là tàu điện nên đi nhanh nhất và rẻ nhất, mình rất recommend các bạn chọn cách này, đơn giản nhanh chóng tránh được kẹt xe. Sân bay ra trạm tàu cũng hơi xa, nếu lo lắng nhiều hành lý thì yên tâm có xe đẩy của sân bay bạn cứ chất đồ lên và đi là tới. Tìm ga AREX không khó:  ra khỏi khu nhập cảnh, đi theo biển chỉ của sân bay ra Airport Railroad Express (AREX). Hướng dẫn ra ga AREX (Source:...