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

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

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


1、延迟加载

定义

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

1.1、 延迟加载设置

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

设置项 描述 默认值
lazyLoadingEnabled 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 false
aggressiveLazyLoading 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载 true

    <settings>
        <setting name="aggressiveLazyLoading" value="false"/> 
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="lazyLoadTriggerMethods" value=""/>
        <setting name="logImpl" value="SLF4J" />
    settings> 

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文件中开启全局缓存设置


<settings>
    <setting name="cacheEnabled" value="true>

2.二级缓存是基于 namespace的,在映射文件中添加缓存

<mapper namespace="com.iflytek.mapper.UserMapper">
  
  
  <cache/>
mapper>

4 自定义缓存

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

参考文献

  • MyBatis 一、二级缓存和自定义缓存
  • MyBatis 延迟加载,一级缓存,二级缓存设置

你可能感兴趣的:(数据库)