Spring中使用Ehcache的方法和注意事项

 1 如何调用方法数据增加缓存
 2 @Cacheable(value="MY_CACHE", key="'cache_business_' + #business_id")
 3 public ShopCacheData loadShopData(long business_id) throws SQLException{
 4         ...
 5         return scd;
 6 }
 7 
 8 如何通过调用清空缓存
 9 @CacheEvict(value="MY_CACHE",  key="'cache_business_' + #business_id")        //allEntries=true
10 public void cleanBusinessFromCache(long business_id) throws SQLException {
11        return;
12 }
13 
14 上面使用Cacheable注释的方式,如果在同一个Class中调用则缓存无效。
15 
16 如:
17 
18 public class ShopManager{
19 
20 @Cacheable(value="MY_CACHE", key="'cache_business_' + #business_id")
21 public ShopCacheData loadShopData(long business_id) throws SQLException{
22         ...
23         return scd;
24 }
25 
26 如何通过调用清空缓存
27 @CacheEvict(value="MY_CACHE",  key="'cache_business_' + #business_id")        //allEntries=true
28 public void cleanBusinessFromCache(long business_id) throws SQLException {
29        return;
30 }
31 
32 
33 public void readShop(){
34 
35     ShopCacheData shop = loadShopData(1000);    //此处调用每次都会执行方法体,而不会使用相映的缓存
36 
37     ....
38 
39 }
40 
41 }
42 
43 
44 
45 解决办法:必须在方法中手工写入对Ehcache操作的代码才能起到作用
46 
47 public class ShopManager{
48 
49 @Cacheable(value="MY_CACHE", key="'cache_business_' + #business_id")
50 public ShopCacheData loadShopData(long business_id) throws SQLException{
51         ShopCacheData scd = null;
52         ...
53         Element el = null;
54         CacheManager manager = CacheManager.create();
55         // 通过manager可以生成指定名称的Cache对象
56         Cache cache = manager.getCache("MY_CACHE");
57         if(cache.isKeyInCache("cache_business_"+business_id)){
58             el = cache.get("cache_business_"+business_id);
59             return (ShopCacheData)el.getObjectValue();
60         }
61         //在缓存中没有找到对应的key则从数据库读取相关信息,并在得到后将结果放入缓存
62         scd = loadShopDatafromDb(business_id);
63         if(scd!=null){
64                 el = new Element("cache_business_"+business_id, scd);
65                 cache.put(el);
66         }
67         return scd;
68 }
69 
70 @CacheEvict(value="MY_CACHE",  key="'cache_business_' + #business_id")        //allEntries=true
71 public void cleanBusinessFromCache(long business_id) throws SQLException {
72         CacheManager manager = CacheManager.create();     //通过manager可以生成指定名称的Cache对象
73         Cache cache = manager.getCache("MY_CACHE");
74         if(cache.isKeyInCache("cache_business_"+business_id)){   //将指定key的缓存对象从缓存中清除
75             cache.remove("cache_business_"+business_id);
76         }
77        return;
78 }
79 
80 
81 public void readShop(){
82 
83     ShopCacheData shop = loadShopData(1000);   //此时调用缓存将有效
84 
85     ....
86 
87 }
88 
89 }

 

如何调用方法数据增加缓存
@Cacheable(value="MY_CACHE", key="'cache_business_' + #business_id")
public ShopCacheData loadShopData(long business_id) throws SQLException{
        ...
        return scd;
}

如何通过调用清空缓存
@CacheEvict(value="MY_CACHE",  key="'cache_business_' + #business_id")        //allEntries=true
public void cleanBusinessFromCache(long business_id) throws SQLException {
       return;
}

上面使用Cacheable注释的方式,只能在Controller中调用使缓存有效,如果在同一个Class中调用则缓存无效。

如:

public class ShopManager{

@Cacheable(value="MY_CACHE", key="'cache_business_' + #business_id")
public ShopCacheData loadShopData(long business_id) throws SQLException{
        ...
        return scd;
}

如何通过调用清空缓存
@CacheEvict(value="MY_CACHE",  key="'cache_business_' + #business_id")        //allEntries=true
public void cleanBusinessFromCache(long business_id) throws SQLException {
       return;
}

 

public void readShop(){

    ShopCacheData shop = loadShopData(1000);    //此处调用每次都会执行方法体,而不会使用相映的缓存

    ....

}

}

 

解决办法:必须在方法中手工写入对Ehcache操作的代码才能起到作用

public class ShopManager{

@Cacheable(value="MY_CACHE", key="'cache_business_' + #business_id")
public ShopCacheData loadShopData(long business_id) throws SQLException{
        ShopCacheData scd = null;
        ...
        Element el = null;
        CacheManager manager = CacheManager.create();
        // 通过manager可以生成指定名称的Cache对象
        Cache cache = manager.getCache("MY_CACHE");
        if(cache.isKeyInCache("cache_business_"+business_id)){
            el = cache.get("cache_business_"+business_id);
            return (ShopCacheData)el.getObjectValue();
        }

        //在缓存中没有找到对应的key则从数据库读取相关信息,并在得到后将结果放入缓存
        scd = loadShopDatafromDb(business_id);
        if(scd!=null){
                el = new Element("cache_business_"+business_id, scd);
                cache.put(el);
        }
        return scd;
}

@CacheEvict(value="MY_CACHE",  key="'cache_business_' + #business_id")        //allEntries=true
public void cleanBusinessFromCache(long business_id) throws SQLException {
        CacheManager manager = CacheManager.create();     //通过manager可以生成指定名称的Cache对象
        Cache cache = manager.getCache("MY_CACHE");
        if(cache.isKeyInCache("cache_business_"+business_id)){   //将指定key的缓存对象从缓存中清除
            cache.remove("cache_business_"+business_id);
        }

       return;
}

 

public void readShop(){

    ShopCacheData shop = loadShopData(1000);   //此时调用缓存将有效

    ....

}

}

posted @ 2018-03-20 17:24  花儿为何那样红  阅读(1623)  评论(0编辑  收藏  举报