MyBatis一级缓存和二级缓存
Posted 爱拼才会赢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis一级缓存和二级缓存相关的知识,希望对你有一定的参考价值。
MyBatis 中的缓存
一级缓存:
Mybatis 一级缓存的作用域是同一个SqlSession,在同一个sqlSession中执行两次相同的SQL语句,第一次执行完毕后会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据不再从数据库中查询,从而提高查询效率。当一个sqlSession结束后该SqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。
一级缓存是session级别的缓存,数据被缓存在session对象中
特点:必须使用同一个session,一级缓存对增删改都是安全的。
二级缓存:
二级缓存放在他的命名空间里,默认是打开的,使用二级缓存属性类需要实现Serializable序列化接口,(可用于保存对象的状态),可在他的映射文件中配置<cache/>
二级缓存是sessionFactory级别的缓存,数据被缓存在sessionFactory对象中
特点:必须使用同一个sessionFactory对象,只对查询缓存,二级缓存对于增删改是不安全的,只对查询安全,二级缓存会对缓存的数据进行序列化。
三 缓存算法:
缓存 文件的读取速度慢于内存 所有有些查询过一次的数据 临时存储在内存中 二次查询 判断 内存是否存在 存在读取内存 不存在读取数据库
缓存举例:
package cn.et.mybatis.lesson05; import java.util.HashMap; import java.util.Map; /** * 缓存每行数据必须唯一标识符 * @author Administrator * */ public class Cache{ //其实缓存就是一个Map private Map map=new HashMap(); public Object cache(String key,Object obj){ if(map.containsKey(key)){ return map.get(key); }else{ //连接数据库读取 map.put(key, obj); return obj; } } public static void main(String[] args) { } }
当内存不足时 考虑 将某些数据T出内存
FIFO 将队列最右端的数据T出内存
LFU 使用次数最少的T出内存
LRU 最近使用次数最少的
以上是关于MyBatis一级缓存和二级缓存的主要内容,如果未能解决你的问题,请参考以下文章