MyBatis学习--缓存

缓存的概念

  将数据存放在程序内存中,极大地提升了程序读写数据的速度

  MyBatis提供缓存,用于减轻数据查询的压力,提高性能

一级缓存

  SqlSession级别的缓存;每个session对应一个缓存;

  一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的;

  一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。

  

  注意事项:

    一级缓存是基于session的缓存,同一个session下的数据实现缓存共享;

    MyBatis默认开启一级缓存,用户不能控制(可以通过开发插件对它进行修改);

    当表中数据被修改(insert/update/delete)的时候,一级缓存会被清空;

    一级缓存还可以手动清空:session.clearCache();

 

二级缓存

  sessionFactory的缓存,不同的session之间也可以实现缓存共享

  MyBatis将sessionFactory级别的二级缓存细分到Mapper级别,即对于每一个Mapper.xml,如果在其中使用了<cache> 节点,则MyBatis会为这个Mapper创建一个Cache缓存对象,如下图所示:

  

  上述的每一个Cache对象,都会有一个自己所属的namespace命名空间,并且会将Mapper的 namespace作为它们的ID;

 

   也可以让多个Mapper共用一个Cache;

    方法一:这些Mapper的namespace相同;

    方法二:使用<cache-ref>节点配置;如:使用<cache-ref namespace=””>节点来指定这个Mapper使用了哪一个Mapper的Cache;

  

  二级缓存的使用:

    1、启用二级缓存,在核心配置文件中配置setting项来启用二级缓存;

     

    2、配置哪些操作需要使用二级缓存,开启mapper的二级缓存;

    

  二级缓存的禁用:

    在查询语句中使用useCache配置项,来设置是否使用二级缓存

   

    注:一级缓存是没有被禁用的;

  二级缓存的刷新:

    要设定是否刷新二级缓存,可以使用flushCache配置项;

  

  注意事项:

    使用二级缓存的映射类要实现序列化(Serializable):二级缓存的存储介质不一定在内存中,实现序列化之后,存储的对象可以存放在远程服务器;

     

    要将数据刷入二级缓存的时候,需要调用session.close();

    数据被修改(insert/update/delete)后,二级缓存也会被清空

 

PS:因作者能力有限,如有误还请谅解;

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页