mysql mybatis 缓存_mysql --- mybatis缓存机制的简单理解

mysql — mybatis缓存机制的简单理解

标签(空格分隔): mybatis mysql 缓存

1、延迟加载

定义

resultMap中的association和collection标签具有延迟加载的功能。延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。

1.1、 延迟加载设置

在mybatis-config.xml中的标签中设置 aggressiveLazyLoading,lazyLoadingEnabled属性。

设置项

描述

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载

true

2、缓存机制

缓存之所以有效,主要是因为程序运行时对内存或者外存的访问呈现局部性特征,局部性特征为空间局部性和时间局部性两方面。时间局部性是指刚刚访问过的数据近期可能再次被访问,空间局部性是指,某个位置被访问后,其相邻的位置的数据很可能被访问到。而MySQL的缓存机制就是把刚刚访问的数据(时间局部性)以及未来即将访问到的数据(空间局部性)保存到缓存中,甚至是高速缓存中。从而提高I/O效率

按照缓存读写功能的不同,MySQL将缓存分为Buffer缓存和Cache缓存。

Buffer缓存。由于硬盘的写入速度过慢,或者频繁的I/O,对于硬盘来说是极大的效率浪费。那么可以等到缓存中储存一定量的数据之后,一次性的写入到硬盘中。Buffer 缓存主要用于写数据,提升I/O性能。

Cache 缓存。 Cache 缓存一般是一些访问频繁但是变更较少的数据,如果Cache缓存已经存储满,则启用LRU算法,进行数据淘汰。淘汰掉最远未使用的数据,从而开辟新的存储空间。不过对于特大型的网站,依靠这种策略很难缓解高频率的读请求,一般会把访问非常频繁的数据静态化,直接由nginx返还给用户。程序和数据库I/O设备交互的越少,则效率越高。

3、mybatis查询缓存

3.1 一级缓存(默认开启)

mybatis的一级缓存是SqlSession,其内部是通过一个hashmap来实现的,hashmap的键是数据库记录的主键。每个SqlSession之间是相互独立的。(对于某个查询,根据statementId,params,rowBounds来构建一个key值,根据这个key值去缓存Cache中取出对应的key值存储的缓存结果;),所以在这种情况下,在不同sqlseesion中执行相同的mapper下的相同参数的方式时,都要从数据库中读取,为了针对这种问题,引进二级缓存。

在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。

3.2 二级缓存

二级缓存是基于namespace的。一个namespace对应一个二级缓存。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。

3.2.1 二级缓存的工作顺序

1.在一个会话中,执行一个查询操作后,数据会被保存到一个缓存中,

2.只有当这个会话被关闭以后,那么一级缓存中的数据会被保存到二级缓存中,这个时候当有新的会话查询时,会直接从二级缓存中获取数据。

3.2.2 二级缓存的开启

1.在mybatis的配置文件mybatis-config.xml文件中开启全局缓存设置

4 自定义缓存

自定义缓存对象,该对象必须实现 org.apache.ibatis.cache.Cache 接口。(这里我就不造轮子了。)

参考文献

MyBatis 一、二级缓存和自定义缓存

MyBatis 延迟加载,一级缓存,二级缓存设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值