美文网首页JavaJava学习笔记java
JFinal2.2初体验之EhCachePlugin 篇(十)

JFinal2.2初体验之EhCachePlugin 篇(十)

作者: 葉糖糖 | 来源:发表于2016-10-19 16:34 被阅读280次
    1、关于EhCachePlugin

    上一小节,我们已经学会如何简单的使用缓存。其实jfinal框架为我们提供了更加便捷的缓存神器,就是今天我们要一起学习使用的EhCachePlugin插件。

    EhCachePluginJFinal 集成的缓存插件,通过使用 EhCachePlugin 可以提高系统的并发访问速度。

    2、新手上路

    想一千遍代码,不如动手敲一遍。

    2.1配置 EhCachePlugin

    EhCachePlugin既然是以插件形式配合jfinal框架来进行缓存处理的,那么要想在程序中使用这个EhCachePlugin,先得在配置文件中配置该插件。代码如下:

         /**
         * 配置插件
         */
        public void configPlugin(Plugins me) {
            //开启缓存配置
             me.add(new EhCachePlugin());
            
            // 配置C3p0数据库连接池插件
            C3p0Plugin C3p0Plugin = createC3p0Plugin();
            me.add(C3p0Plugin);
            
           //省略部分配置
        }
    
    2.2 正确缓存姿势

    改造我们之前的查询方法。代码如下:

         //CacheInterceptor拦截器可以帮助action进行缓存  
        @Before(CacheInterceptor.class)
         public void login(){
             //创建service对象
             LoginService loginService = new LoginService();
             //创建record对象
             Record record = new Record();
             record.set("name",  getPara("user.name"));
             record.set("pwd",  getPara("user.pwd"));
            //添加记录
             loginService.addUser(record);
             //查询用户数据并添加入容器中
             setAttr("userList", loginService.queryUsetrList());
             //渲染页面
             render("list.html");
         }
    
    2.3至关重要的配置文件——ehcache.xml

    这种使用方法使用的是actionKey作为缓存的名字,所以这边可以在配置文件中配置actionUrl。具体配置如下:

        <cache name="/sinlogin/login"
               maxEntriesLocalHeap="10000"
               maxEntriesLocalDisk="1000"
               eternal="false"
               overflowToDisk="true"
               diskSpoolBufferSizeMB="20"
               timeToIdleSeconds="300"
               timeToLiveSeconds="600"
               memoryStoreEvictionPolicy="LFU"
               transactionalMode="off" />
    

    这样当请求同一个action的时候,CacheInterceptor就可以帮忙来处理缓存操作了。

    2.4老司机之使用actionName+注解

    使用注解来改变默认的actionName,需要修改xml配置文件,在controller中的action上添加注解。示例如下:

        <cache name="userList"
               maxEntriesLocalHeap="10000"
               maxEntriesLocalDisk="1000"
               eternal="false"
               overflowToDisk="true"
               diskSpoolBufferSizeMB="20"
               timeToIdleSeconds="300"
               timeToLiveSeconds="600"
               memoryStoreEvictionPolicy="LFU"
               transactionalMode="off" />
    
        @Before(CacheInterceptor.class)  //CacheInterceptor拦截器可以帮助action进行缓存  
         @CacheName("userList")   //缓存名称
         public void login(){
             //创建service对象
             LoginService loginService = new LoginService();
             //创建record对象
             Record record = new Record();
             record.set("name",  getPara("user.name"));
             record.set("pwd",  getPara("user.pwd"));
            //添加记录
             loginService.addUser(record);
             //查询用户数据并添加入容器中
             setAttr("userList", loginService.queryUsetrList());
             //渲染页面
             render("list.html");
         }
    
    3、自定义缓存处理场景

    当我们不想对action进行缓存的时候,只想针对部分数据进行缓存的时候,可以使用一种更加高效的操作工具CacheKit CacheKit是缓存工具操作类。

       /**
        * @author yetangtang
        * @see 查询用户信息
        * @param void
        * @return Page<Record> list
        */
        public Page<Record> queryUsetrList(){
            /**
            
            //使用Db中的paginate(分页)方法。同model操作一样
            //查询user id>2的用户信息,展现形式是每页4条数据,当前页为1
            Page<Record> list = CacheKit.get("User","UserList");
            
             //判断数据是否存在于缓存中
            if(list==null){
                 //不存在,就重新执行查询一次
                 list = Db.paginate(1, 4, "select * ","from user where id > ? ",2);
                  //将数据存储在缓存中,第一参数是cacheName,第二个是KeyName,第三个是要保存的数据信息   ;       
                 CacheKit.put("User", "UserList", list);
            }
            
            //不使用插件的缓存方式
            //Page<Record> list = Db.paginateByCache("userInfo", "userList", 1, 4, "select * ","from user where id > ? ",2);
            
            //普通的查询方式
            //Page<Record> list = Db.paginate(1, 4, "select * ","from user where id > ? ",2);
    
            //返回查询结果
            return list;
        }
        
    
    4、清理缓存

    清理缓存就比较简单了,使用注解分分钟解决问题。EvictInterceptor 可以根据 CacheName 注解自动清除缓存。

         @Before(EvictInterceptor.class)   //根据CacheName清理缓存信息
        @CacheName("userList")
         public void login(){
         //省略主体代码
    }
    

    PS:关于缓存这一块其实还是比较简单的,简单的梳理了一遍之后,小伙伴们最好能边动手,边读源码来学习。祝大家学有所成,加油。

    相关文章

      网友评论

        本文标题:JFinal2.2初体验之EhCachePlugin 篇(十)

        本文链接:https://www.haomeiwen.com/subject/qxdxuttx.html