Mybatis中的缓存

一,为什么要使用缓存

1,缓存的作用

        缓存(cache)的作用是为了减去数据库的压力,提高查询性能
缓存实现的原理是
从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)
中,当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库
执行 select 语句从而减少了对数据库的查询次数,因此提高了数据库的性能。

2,Mybatis中的缓存

Mybatis 有一级缓存和二级缓存。
一级缓存的作用域是同一个 SqlSession,
在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库
中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查
询,从而提高查询效率。当一个 sqlSession 结束后该 sqlSession 中的一级缓存
也就不存在了。Mybatis 默认开启一级缓存。
二级缓存是多个 SqlSession 共享的,其作用域是同一个 namespace,不同的
sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同
即最终执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存
(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
Mybatis 默认没有开启二级缓存需要在 setting 全局参数中配置开启二级缓存。

(1)一级缓存

Mybatis 对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓
存,一级缓存只是相对于同一个 SqlSession 而言
所以在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调
用一个 Mapper 方法,往往只执行一次 SQL,因为使用 SelSession 第一次查询
后,MyBatis 会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,
并且缓存没有超时的情况下,SqlSession 都会取出当前缓存的数据,而不会再
次发送 SQL 到数据库。

(2)二级缓存

二级缓存是 SqlSessionFactory 级别的,根据 mapper 的 namespace 划分
区域的,相同 namespace 的 mapper 查询的数据缓存在同一个区域,如果使
用 mapper 代理方法每个 mapper 的 namespace 都不同,此时可以理解为二
级缓存区域是根据 mapper 划分。
每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数
据写入缓存
Mybatis 内部存储缓存使用一个 HashMap,key 为 hashCode+sqlId+Sql 语句。
value 为从查询出来映射生成的 java 对象。
sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区
域,防止脏读。二级缓存参考下图所示:
                MyBatis 的缓存机制整体设计以及二级缓存的工作模式

(3)配置二级缓存配置

第一步:启用二级缓存
        在 SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当
cacheEnabled 设置为 true 时启用二级缓存,设置为 false 时禁用二级缓存。
        <setting name="cacheEnabled" value="true"/>
第二步:对象序列化
        将所有的 POJO 类实现序列化接口 Java.io. Serializable。
第三步:配置映射文件
        在 Mapper 映射文件中添加<cache />,表示此 mapper 开启二级缓存。
当 SqlSeesion 关闭时,会将数据存入到二级缓存.

二,MyBatis 架构

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值