博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis总结八:缓存介绍(一级缓存,二级缓存)
阅读量:4316 次
发布时间:2019-06-06

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

简介

为数据库的查询进行缓存,是减少数据库压力的主要途径。分为一级缓存和二级缓存。

一级缓存:session级别缓存,作用于当前会话。

二级缓存:SessionFactory级别缓存,作用于整个SessionFactory,多个会话之间可以共享缓存

 

一级缓存:

特点:

  • mybatis的一级缓存默认就是开启的,并且无法关闭。

  • mybatis的一级缓存作用域是当前session,一次openSession()后,如果相同的statement和相同参数,则不进行查询而是从缓存命中并且返回,如果没有命中则查询数据库。

  • 任何的增删改操作都会导致缓存被清空

  • 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回

测试一级缓存:

@Test    public void testLevelOneCache() throws Exception {        User user1 = mapper.getUserById(1);        System.out.println(user1);        System.out.println("---------------------------");        User user2 = mapper.getUserById(1);        System.out.println(user2);    }

输出结果:

我们可以看出来 第二次查询的时候 并没有执行sql语句 而是从缓存中读取的。

 

二级缓存:

特点:

  • 二级缓存需要手动开启,开启的方式是在Mapper.xml中添加标签:<cache/>

  • 二级缓存的作用域是整个SessionFactory,并且是同一个Mapper中,如果namespace、statement和SQL参数一致,则缓存命中

  • 映射语句文件中的所有select语句将会被缓存。

  • 映射语句文件中的所有insert,update和delete语句会刷新缓存。

  • 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。

  • 缓存会根据指定的时间间隔来刷新。

  • 缓存默认会存储1024个对象

开启二级缓存:

测试二级缓存:

注意这里有个前提条件,就是User类必须继承Serializable接口

public class UserMapperTest {    UserMapper mapper;    SqlSessionFactory sqlSessionFactory;    SqlSession sqlSession;    @Before    public void setUp() throws Exception {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        sqlSession = sqlSessionFactory.openSession(true);        mapper = sqlSession.getMapper(UserMapper.class);    }    @Test    public void testLevelTwoCache() {        // 一次会话中        // 1 第1次查询        User user1 = mapper.getUserById(1);        System.out.println(user1);        // 关闭session        sqlSession.close();        // 重新开启session        sqlSession = sqlSessionFactory.openSession(true);        // 重新获取mapper        mapper = sqlSession.getMapper(UserMapper.class);        System.out.println("------------------------------------------");        // 2 第2次查询        User user2 = mapper.getUserById(1);        System.out.println(user2);    }}

cache标签常用属性:

flushInterval="60000"
size="512"
readOnly="true"/>

 

这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。

可用的收回策略有:

  • LRU – 最近最少使用的:移除最长时间不被使用的对象。

  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

  • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

  • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

默认的是 LRU。

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。

 

另外mybatis-config.xml中的settings中有个参数叫做cacheEnabled,默认为true表示开启缓存,如果设置为flase所有的缓存将消失。

 

转载于:https://www.cnblogs.com/blazeZzz/p/9296857.html

你可能感兴趣的文章
cookie
查看>>
二级图片导航菜单
查看>>
<Using parquet with impala>
查看>>
07-Java 中的IO操作
查看>>
uclibc,eglibc,glibc之间的区别和联系【转】
查看>>
Java魔法堂:找外援的利器——Runtime.exec详解
查看>>
mysql数据库存放路径
查看>>
TestNG(五)常用元素的操作
查看>>
解决 Visual Studio 点击添加引用无反应的问题
查看>>
通过镜像下载Android系统源码
查看>>
python字符串格式化 %操作符 {}操作符---总结
查看>>
windows 不能在 本地计算机 启动 Apache
查看>>
iOS开发报duplicate symbols for architecture x86_64错误的问题
查看>>
Chap-6 6.4.2 堆和栈
查看>>
【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
查看>>
C# MySql 连接
查看>>
div+css教程网站建设门户网站和电子商务网站CSS样式表
查看>>
sk_buff Structure
查看>>
oracle的级联更新、删除
查看>>
多浏览器开发需要注意的问题之一
查看>>