Mybatis的缓存

        MyBatis是一种Java持久化框架,在数据访问层提供了简单且灵活的方式来与数据库交互。在MyBatis中,缓存是一种重要的特性,它可以提高应用程序的性能。

        一级缓存是默认开启的,它指的是在同一个SqlSession中执行相同的SQL语句时,会将查询结果缓存起来,下次再执行相同的SQL语句时,直接从缓存中获取结果,而不需要再访问数据库。一级缓存是基于线程的,因此它只在同一个SqlSession内有效。如果SqlSession执行commit(即增删改操作),就会清空缓存,以避免脏读。

        实际开发中,MyBatis通常和Spring进行整合开发。Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的,这是通过mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。 每次查询之后都要进行关闭sqlSession,关闭之后数据被清空。所以spring整合之后,如果没有事务,一级缓存是没有意义的。     

        二级缓存是可选的,它可以跨多个SqlSession共享缓存结果。默认没有开启,需要手动在 setting 全局参数中配置开启二级缓存。当开启了二级缓存后,如果多个SqlSession执行相同的SQL语句,查询结果会被缓存到二级缓存中,下次再执行相同的SQL语句时,可以直接从缓存中获取结果。二级缓存是基于命名空间(Mapper)的,因此它可以在不同的SqlSession之间共享。

        前面我们说到,Spring和MyBatis整合时, 每次查询之后都要进行关闭sqlSession,关闭之后数据被清空。所以spring整合之后,如果没有事务,一级缓存是没有意义的。那么如果开启二级缓存,关闭sqlsession后,会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。这样,缓存在sqlsession关闭之后依然存在。

         所以,对于查询多commit少且用户对查询结果实时性要求不高,此时采用mybatis二级缓存技术降低数据库访问量,提高访问速度。但不能滥用二级缓存,二级缓存也有很多弊端,从MyBatis默认二级缓存是关闭的就可以看出来。二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到的数据就是错误的。
举个简单的例子:
        订单和订单详情,orderMapper、orderDetailMapper。在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,这个时候有人要修改订单的基本信息,那就是在orderMapper的namespace下修改,他是不会影响到orderDetailMapper的缓存的,那么你再次查找订单详情时,拿到的是缓存的数据,这个数据其实已经是过时的。

根据以上,想要使用二级缓存时需要想好两个问题:
1)对该表的操作与查询都在同一个namespace下,其他的namespace如果有操作,就会发生数据的脏读。
2)对关联表的查询,关联的所有表的操作都必须在同一个namespace。

总结:

        MyBatis的缓存可以提高查询性能,减少数据库访问次数,但也需要注意一些缓存相关的问题。例如,当数据库中的数据被更新时,对应的缓存也需要被清除,否则可能会出现脏读的问题。此外,缓存也会占用一定的内存空间,对于内存敏感的应用程序,需要谨慎使用缓存。

        总的来说,MyBatis的缓存是一种提高性能的机制,合理地使用缓存可以优化应用程序的数据库访问效率。

MyBatis 提供了两级缓存来提高性能和减少数据库访问次数:

        1. 一级缓存(本地缓存):默认情况下,MyBatis 开启了一级缓存。一级缓存是在同一个 SqlSession 中有效的,它会将查询结果缓存在内存中,下次查询相同的语句时,会直接从缓存中获取,而不需要再次查询数据库。一级缓存是基于对象引用的缓存,因此在同一个 SqlSession 中对同一个对象进行修改时,会影响缓存中的对象。

        2. 二级缓存(全局缓存):二级缓存是在同一个 Mapper 的不同 SqlSession 之间共享的缓存。它可以跨越多个 SqlSession,甚至多个应用程序实例。默认情况下,二级缓存是禁用的,需要在 Mapper 配置文件中进行相应的配置。二级缓存是基于序列化的缓存,因此需要缓存的对象必须实现 Serializable 接口。

        需要注意的是,尽管缓存可以提高性能,但在某些情况下,缓存可能会导致数据不一致的问题。因此,在使用 MyBatis 缓存时,需要根据具体的业务需求和数据一致性要求来合理配置和使用缓存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值