zoukankan      html  css  js  c++  java
  • 项目搭建系列之三: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);
  • 相关阅读:
    2020牛客暑期多校第三场B-Classical String Problem(字符串移动思维)
    2020牛客暑期多校第四场B-Basic Gcd Problem(思维+数论)
    2020牛客暑期多校第三场E-Two Matchings(规律DP)
    2020牛客暑期多校第三场C-Operation Love(计算几何-顺逆时针的判断)
    odoo高级物流应用:跨厂区生产
    Odoo车辆管理
    安装odoo 9实录
    Odoo 养猪
    【转】结转本年利润的有关分录
    Odoo POS
  • 原文地址:https://www.cnblogs.com/hehaiyang/p/4277220.html
Copyright © 2011-2022 走看看