博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis_二级缓存
阅读量:5032 次
发布时间:2019-06-12

本文共 2894 字,大约阅读时间需要 9 分钟。

我们可以自己配置管理二级缓存

在一个项目中肯定会存在很多公用的查询数据,对于这一部分的数据,没不要每一个用户访问时都去查询数据库,因此配置二级缓存僵尸飞车必要的。

1.在核心配置文件sqlMapConfig.xml中的configuration下的setting下加入:

2.在某一个映射xml(例如PersonMap.xml)中的mapper下加入:

3.Person必须序列化并生成UID(因为缓存的数据不只是放在内存中,也可以放在硬盘上,因为内存大小是有限的):

public class Person implements Serializable {    /**     *      */    private static final long serialVersionUID = 1L;    private Integer id;    private String name;    private Integer gender;    private String address;    private Date birthday;    private List
orderList; public List
getOrderList() { return orderList; } public void setOrderList(List
orderList) { this.orderList = orderList; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; }

UID在序列化好后鼠标放在Person上的会显示。

 

设置好二级缓存后,就算session名字不同,只要查询的sql相同,第二次就不会再发出sql而是从缓存取。因此二级缓存是跨session的。

SqlSessionFactory sessionFactory;    public void selectPersonByIdLazy() {        // 创建SqlSession        SqlSession session = sessionFactory.openSession();        try {            // 首先查询二级缓存如果有数据就从其中拿出数据就可以,如果没有数据,就去一级缓存中来查,一级缓存如果也没有,那就去数据库查,查出来后把数据放进一级和二级缓存中            Person person = session.selectOne("xxx.x.mapper.PersonMapper.selectPersonById", 1);            System.out.println(person);        }finally {                session.close();            }            //第二次跨session查,也是从二级缓存中取            SqlSession session1 = sessionFactory.openSession();            try {            Person person = session1.selectOne("xxx.x.mapper.PersonMapper.selectPersonById", 1);            System.out.println(person);        }finally {            session.close();        }    }

和一级缓存同理,两次查询中间如果有修改语句,会清掉缓存。第二次查询还是要查数据库。

 

 

用不用缓存是可配的。上面查询的id是selectPersonById,那就在PersonMapper.xml中的这个id中配置:

useCache:是否启用二级缓存

true是用缓存,false是不用缓存,如果是false,那么两次查询中间没有修改,第二次查询也会查数据库

 

更新是会不会清掉缓存也能配置,在更新中写:

flushCache:是否清掉缓存,true是清掉,false是不清,如果是false,那么两次查询中间修改了,第二次查询也是从缓存中取
update person t set t.name = #{name}, t.gender = #{gender}, t.person_addr = #{personAddr}, t.birthday = #{birthday} where t.person_id = #{personId}
flushCache在insert update select delete中都有

 

 

 

  

 

转载于:https://www.cnblogs.com/lonske/p/9026940.html

你可能感兴趣的文章
重温.NET下Assembly的加载过程
查看>>
前端读者 | 前端开发者调试面板vConsole
查看>>
PrimeNumber
查看>>
Array对象的方法实现(1)----Array.prototype.push和Array.prototype.concat(实现常规参数的功能)...
查看>>
UVA 10200 Prime Time 水
查看>>
Fidder模拟发送请求
查看>>
Linux基础
查看>>
js时间的操作,为了让cookie在当天24点过期~
查看>>
【USACO】干草金字塔
查看>>
编译Nginx, 并使用自签证书实现https访问
查看>>
整合VS2010和NUnit
查看>>
01Hibernate
查看>>
《nodejs+gulp+webpack基础实战篇》课程笔记(五)-- 实战演练,构建用户登录
查看>>
工作中EF遇到的问题
查看>>
bzoj1505 [NOI2004]小H的小屋
查看>>
js判断是否包含指定字符串
查看>>
背包格子的物品交换加移动的实现
查看>>
dhroid - NetJSONAdapter 网络化的adapter
查看>>
CSS创建三角形(小三角)的几种方法 (转)
查看>>
字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
查看>>