1、关于EhCachePlugin
上一小节,我们已经学会如何简单的使用缓存。其实jfinal框架为我们提供了更加便捷的缓存神器,就是今天我们要一起学习使用的EhCachePlugin插件。
EhCachePlugin 是 JFinal 集成的缓存插件,通过使用 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。具体配置如下:
这样当请求同一个action的时候,CacheInterceptor就可以帮忙来处理缓存操作了。
2.4老司机之使用actionName+注解
使用注解来改变默认的actionName,需要修改xml配置文件,在controller中的action上添加注解。示例如下:
@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 list
*/
public Page queryUsetrList(){
/**
//使用Db中的paginate(分页)方法。同model操作一样
//查询user id>2的用户信息,展现形式是每页4条数据,当前页为1
Page 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 list = Db.paginateByCache("userInfo", "userList", 1, 4, "select * ","from user where id > ? ",2);
//普通的查询方式
//Page 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:关于缓存这一块其实还是比较简单的,简单的梳理了一遍之后,小伙伴们最好能边动手,边读源码来学习。祝大家学有所成,加油。