mybatis 缓存
来源:互联网 发布:mac文件夹属性隐藏 编辑:程序博客网 时间:2024/06/06 03:53
Mybatis缓存 有 一级缓存 和 二级缓存:
Mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。
在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。
Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
在同一个namespace下的mapper文件中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则二级缓存清空。
一级缓存原理
一级缓存区域是根据SqlSession为单位划分的。
每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。
SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。
二级缓存原理
二级缓存是mapper级别的。Mybatis默认是没有开启二级缓存。
第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。
第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息。会去对应的二级缓存内取结果。
如果调用相同namespace下的mapper映射文件中的增删改SQL,并执行了commit操作。此时会清空该namespace下的二级缓存。
开启二级缓存
1、 在核心配置文件SqlMapConfig.xml中加入以下内容(开启二级缓存总开关):
cacheEnabled设置为 true
2、在映射文件中,加入以下内容,开启二级缓存:
实现序列化
由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化。
如果该类存在父类,那么父类也要实现序列化。
禁用二级缓存
该statement中设置userCache=false可以禁用当前select语句的二级缓存,即每次查询都是去数据库中查询,默认情况下是true,即该statement使用二级缓存。
刷新二级缓存
自定义缓存:
实现cache 中的方法:
1.实现 序列化 和 反序列化
序列化
/** * 1=Student对象 * 写入数到redis时 * jedis.set(主键 ,objectToByteArray(Student对象)) * 序列化 * @param obj * @return * @throws IOException */public static byte[] objectToByteArray(Object obj) throws IOException{ByteOutputStream boss=new ByteOutputStream();ObjectOutputStream oos=new ObjectOutputStream(boss);oos.writeObject(obj);return boss.getBytes();}
反序列化
/** * byte[] bt=get("主键") * Student s=byteArrayToObject(bt); * 反序列化字节数组为 对象 * @param bt * @return * @throws IOException */public static Object byteArrayToObject(byte[] bt) throws Exception{ByteInputStream bis=new ByteInputStream(bt,bt.length);ObjectInputStream ois=new ObjectInputStream(bis);return ois.readObject();}
下面 就是实现了cache的 一个类 例子:
package cn.et.lesson05.xml;import java.io.IOException;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.apache.ibatis.cache.Cache;import cn.et.lesson05.JavaRedis;import redis.clients.jedis.Jedis;public class RedisCache implements Cache {/** * 操作redis对象 */Jedis jedis=new Jedis("localhost",6379);/** * 缓存的id */private String cacheId;public RedisCache(String cacheId){this.cacheId=cacheId;}public void clear() {//jedis.flushDB();}public String getId() {return cacheId;}/** * mybatis自动调用getObject检测是否缓存中存在 */public Object getObject(Object key) {try {byte[] bt=jedis.get(JavaRedis.objectToByteArray(key));if(bt==null){return null;}return JavaRedis.byteArrayToObject(bt);} catch (Exception e) {e.printStackTrace();}return null;}public ReadWriteLock getReadWriteLock() {return new ReentrantReadWriteLock();}public int getSize() {return 1;}/** * mybatis读取数据时 将数据库中读取的数据 通过 * putObject设置到缓存中 */public void putObject(Object key, Object value) {//写入redistry {jedis.set(JavaRedis.objectToByteArray(key), JavaRedis.objectToByteArray(value));} catch (IOException e) {e.printStackTrace();}}/** * mybatis缓存策略 自动判断内存的大小 绝对是否删除某些过期 久远的数据 * @param key * @return */public Object removeObject(Object key) {Object obj=getObject(key);try {jedis.del(JavaRedis.objectToByteArray(key));} catch (IOException e) {e.printStackTrace();}return obj;}}
- MyBatis-缓存
- MyBatis 缓存
- mybatis缓存
- mybatis缓存
- MyBatis 缓存
- mybatis 缓存
- mybatis缓存
- MyBatis缓存
- MyBatis缓存
- MyBatis 缓存
- mybatis 缓存
- Mybatis缓存
- mybatis 缓存
- Mybatis缓存
- MyBatis 缓存
- mybatis缓存
- MyBatis缓存
- Mybatis缓存
- 关键字查找
- 2017年第26届上海国际连锁加盟展览会会刊(参展商名录)
- PHP字符串的表示方法
- Android多线程的四种方式
- spring mvc集成mybatis进行数据库访问
- mybatis 缓存
- bfs hdu 1241
- CentOS 编译vim no terminal library found
- Log4j2之RollingFileAppender学习笔记
- rails中active_record的delete和destroy方法
- 如何拍出更好看的照片,那是有技巧的
- sparkmllib (1)
- appium使用教程
- 【Java】【注解】自定义注解