項目搭建系列之三:SpringMVC框架下使用Ehcache對象、數據緩存


  注明:該文章為以前寫的文章,這里只更改了標題,無GitHub源碼下載。

一、准備工作

  如果已經成功搭建SpringMVC環境,那么就可以進入Ehcache的准備工作了。
1、下載jar包
    Ehcache 對象、數據緩存:
    http://ehcache.org/downloads/destination?name=ehcache-2.9.0-distribution.tar.gz&bucket=tcdistributions&file=ehcache-2.9.0-distribution.tar.gz
2、需要添加jar包到工程中
    ehcache-core-2.9.0.jar
3、需要添加以下文件到src目錄中
    ehcache.xml  配置文件
    ehcache.xsd  XML結構定義文件
    這些文件在ehcache-2.9.0文件夾中可以找到

二、Ehcache配置介紹

   <diskStore>表示當內存緩存中對象數量超過類設置內存緩存數量時,將緩存對象寫到硬盤,path=”java.io.tmpdir”表示把數據寫到這個目錄下。
Java.io.tmpdir目錄在運行時會根據相對路徑生成。
<defaultCache>表示設定緩存的默認數據過期策略。 <cache>表示設定用具體的命名緩存的數據過期策略。 name表示具體的緩存命名。 maxElementsInMemory表示cache中最大允許保存的對象數據量。 eternal:一旦設置了eternal=true,timeToLive和timeToIdle就失效了,緩存里的數據,只有當緩存滿的時候,才有可能被清除。 如果我們想手動給某一條數據設置過期時間,則我們需要把eternal的值設為false。 timeToIdleSeconds:緩存數據的鈍化時間,也就是在一個元素消亡之前,兩次訪問時間的最大時間間隔值,這只能在元素不是永久駐留時有效,
如果該值是 0 就意味着元素可以停頓無窮長的時間。 timeToLiveSeconds:緩存數據的生存時間,也就是一個元素從構建到消亡的最大時間間隔值, 這只能在元素不是永久駐留時有效,如果該值是0就意味着元素可以停頓無窮長的時間。 overflowToDisk:內存不足時,是否啟用磁盤緩存。 memoryStoreEvictionPolicy:緩存滿了之后的淘汰算法。

三、對象、數據緩存案例

ehcache.xml配置:

<?xml version="1.0" encoding="gbk"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd">

    <diskStore path="java.io.tmpdir" />

  <defaultCache
             maxElementsInMemory="10000"
            //緩存中最大允許創建的對象數
             eternal="false"
            //緩存中對象是否為永久的,如果是,超時設置將被忽略,對象從不過期
             timeToIdleSeconds="120"
            //緩存數據鈍化時間(設置對象在它過期之前的空閑時間)
             timeToLiveSeconds="120"
             //緩存數據的生存時間,不論緩存是否一直被使用,都將被刪除
             overflowToDisk="false"
             //內存不足時,是否啟用磁盤緩存
  />

    <cache name="role_cache" maxElementsInMemory="200" eternal="true"
        overflowToDisk="true" />

</ehcache>

applicationContext.xml配置:

啟動工程時初始化緩存

<bean id="roleMenuCacheInit" class="cn.jxufe.web.cache.RoleMenuCacheInit" init-method="init" lazy-init="false" >

RoleMenuCache.java

public class RoleMenuCache {

    private final static String ROLE_NAME="role_cache";
    private static Cache menuCache=CacheManager.getInstance().getCache(ROLE_NAME);
    
    //將角色菜單放入cache
     public synchronized static void putRoleMenuCaches(long roleId, Collection<SystemNavMenu>menu){
        Element element=new Element(roleId, menu);
        menuCache.put(element);
    }
    
    //獲取角色菜單
    @SuppressWarnings("unchecked")
    public synchronized static Collection<SystemNavMenu> getRoleMenuCaches(long roleId){
            Element element = null;
            try {
                element =menuCache.get(roleId);
            } catch (CacheException cacheException) {
                throw new DataRetrievalFailureException("MenuCache failure: " + cacheException.getMessage(), cacheException);
            }
            if (element == null) {
                return null;
            } else {
                return  (Collection<SystemNavMenu>) element.getValue();
            }
        }
    
     public synchronized static void removeAllMenuCache(){
         menuCache.removeAll();
         menuCache.clearStatistics();
         menuCache.flush();
    }
    
    public synchronized static void removeCache(int role){
        menuCache.remove(role);
    }
}

RoleMenuCacheInit.java

public class RoleMenuCacheInit {

    protected final Logger logger = LoggerFactory.getLogger(getClass());
    
    private IndexService indexService;
    
    public void init(){
        logger.info("正在初始化角色菜單緩存");
        Collection<Role> roles=indexService.getAllRoles();
        for(Role r:roles){
            RoleMenuCache.putRoleMenuCaches(r.getId(),indexService.getRoleMenus(r.getId()));
        }
        logger.info("角色菜單緩存初始化結束");
    }

    public void setIndexService(IndexService indexService) {
        this.indexService = indexService;
    }
    
}

四、使用方法

  //從數據庫中獲取角色菜單  
  List<SystemNavMenu> lcMenu=indexService.getRoleMenus(defRoleId); //從緩存中獲取角色菜單 Collection<SystemNavMenu> Menu=RoleMenuCache.getRoleMenuCaches(defRoleId);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM