`
gaojingsong
  • 浏览: 1210549 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【Mybatis之缓存】

阅读更多

许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的。类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsession 的查询语句,即 session 级别的缓存,非全局缓存,或者非二级缓存.

 

如果要实现 mybatis 的二级缓存,一般来说有如下两种方式:

1. 采用 mybatis 内置的 cache 机制。

2. 采用三方 cache 框架, 比如ehcache, oscache 等等.

 

采用 mybatis 内置的 cache 机制。

在 sql 语句映射文件中加入 <cache /> 语句 , 并且相应的 model 类要实现 java Serializable 接口,因为缓存说白了就是序列化与反序列化的过程,所以需要实现这个接口. 单纯的 <cache /> 表示如下意思:

 

1.所有在映射文件里的 select 语句都将被缓存。

2.所有在映射文件里 insert,update 和 delete 语句会清空缓存。

3.缓存使用“最近很少使用”算法来回收

4.缓存不会被设定的时间所清空。

5.每个缓存可以存储 1024 个列表或对象的引用(不管查询出来的结果是什么) 。

6.缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。

 

 

Mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。

 

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



 一级缓存原理

  级缓存

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

 

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



 



 

永久链接: http://gaojingsong.iteye.com/blog/2335573

预览文章: Ibatis源码阅读LRU (least recently used) 之LruCacheController 

永久链接: http://gaojingsong.iteye.com/blog/2335602

预览文章: Mybatis源码阅读之FIFO (FifoCache ) 



 

避免使用二级缓存

可能会有很多人不理解这里,二级缓存带来的好处远远比不上他所隐藏的危害。

缓存是以namespace为单位的,不同namespace下的操作互不影响。

 

insert,update,delete操作会清空所在namespace下的全部缓存。

 

通常使用MyBatis Generator生成的代码中,都是各个表独立的,每个表都有自己的namespace。

 

为什么避免使用二级缓存

在符合【Cache使用时的注意事项】的要求时,并没有什么危害。

其他情况就会有很多危害了。

 

针对一个表的某些操作不在他独立的namespace下进行。

 

例如在UserMapper.xml中有大多数针对user表的操作。但是在一个XXXMapper.xml中,还有针对user单表的操作。

 

这会导致user在两个命名空间下的数据不一致。如果在UserMapper.xml中做了刷新缓存的操作,在XXXMapper.xml中缓存仍然有效,如果有针对user的单表查询,使用缓存的结果可能会不正确。

 

更危险的情况是在XXXMapper.xml做了insert,update,delete操作时,会导致UserMapper.xml中的各种操作充满未知和风险。

 

有关这样单表的操作可能不常见。但是你也许想到了一种常见的情况。

  • 大小: 48.3 KB
  • 大小: 116.1 KB
  • 大小: 261 KB
  • 大小: 131.8 KB
  • 大小: 103.3 KB
0
0
分享到:
评论

相关推荐

    基于mybatis自定义缓存配置Redis

    本篇文章将深入探讨如何在MyBatis中自定义缓存配置,整合第三方缓存系统Redis。 首先,理解MyBatis的缓存机制。MyBatis提供了两级缓存:一级缓存是SqlSession级别的,存在于SqlSessionFactory内部,而二级缓存是...

    mybatis+redis缓存配置

    #### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级缓存和二级缓存。 - **一级缓存**:...

    深入理解MyBatis中的一级缓存与二级缓存

    "深入理解MyBatis中的一级缓存与二级缓存" MyBatis是一种流行的持久层框架,它提供了缓存机制来提高应用程序的性能。在MyBatis中,有两种类型的缓存:一级缓存和二级缓存。下面我们将深入了解MyBatis中的一级缓存和...

    springMybatis+redis三级缓存框架

    首先,MyBatis作为一款轻量级的持久层框架,其核心特性之一就是支持自定义的SQL查询。MyBatis的二级缓存机制允许我们将执行过的SQL查询结果存储在内存中,以供后续相同的查询直接使用,从而避免了重复的数据库访问。...

    MyBatis-05 缓存机制

    本篇文章将详细探讨MyBatis的缓存机制,包括一级缓存和二级缓存,以及如何将MyBatis与第三方缓存EhCache进行整合。 首先,我们来了解一级缓存。一级缓存是SqlSession级别的,也称为本地缓存。当我们在一个...

    MyBatis缓存(一级缓存、二级缓存)

    缓存是MyBatis性能优化的重要手段,分为一级缓存和二级缓存。在这篇文章中,我们将深入探讨这两个级别的缓存机制及其工作原理。 **一级缓存** 一级缓存是SqlSession级别的缓存,也称为局部缓存。当你执行一个查询...

    Mybatis缓存机制案例

    Mybatis缓存机制是数据库操作中的重要组成部分,它能够提高数据访问效率,减少对数据库的重复查询。在Mybatis中,缓存分为一级缓存和二级缓存,这两种缓存各有其特点和应用场景。 一级缓存是SqlSession级别的缓存,...

    mybatis读缓存源码demo

    在 MyBatis 中,缓存机制是提高性能的重要手段,它分为一级缓存和二级缓存。本篇将通过分析“mybatis读缓存源码demo”来探讨这两个缓存层次的工作原理和实现。 一级缓存是 SqlSession 级别的,它是默认开启的。每次...

    SpringMvc+Mybatis+缓存+easyui小demo

    在本项目"SpringMvc+Mybatis+缓存+easyui小demo"中,开发者通过集成SpringMVC、Mybatis、EasyUI以及缓存技术,创建了一个小型的Web应用程序示例。这个项目旨在帮助初学者理解这些关键技术的整合与应用,同时也提供了...

    Mybatis系列教程Mybatis缓存共17页.pdf

    本教程“Mybatis系列教程Mybatis缓存共17页”旨在深入解析Mybatis的缓存功能。 在Mybatis中,缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,同一个SqlSession内的多次相同查询会复用第一次查询的结果,...

    Mybatis的缓存1

    Mybatis的缓存机制是其性能优化的重要组成部分,主要分为一级缓存和二级缓存。一级缓存是指SqlSession级别的缓存,而二级缓存则是全局的Mapper级别的缓存。 **一级缓存介绍及相关配置** 一级缓存是默认开启的,它...

    mybatis一级缓存和二级缓存简单示例

    本文将深入讲解 MyBatis 的一级缓存和二级缓存,并通过一个简单的示例进行说明。 ### 一级缓存 一级缓存是 Session 级别的缓存,也称为本地缓存(Local Cache)。每当我们在一个 SqlSession 中执行了 CRUD 操作,...

    mybatis缓存

    mybatis支持缓存,如果我们查找数据库中某一条记录时,先从缓存中获取,如果缓存中不存在该记录,则从数据库中获取,在放入到缓存中。该文档是关于mybatis使用一级或二级缓存的介绍

    mybatis二级缓存学习

    MyBatis二级缓存是MyBatis框架中的一个重要特性,它允许我们在多个SqlSession之间共享数据,从而提高应用性能。本文将深入探讨MyBatis二级缓存的工作原理、配置方式以及如何在实际开发中有效利用。 一、MyBatis二级...

    缓存处理-mybatis层

    2. 分布式环境下的缓存:在分布式系统中,二级缓存可能导致数据冲突,这时可以考虑使用分布式缓存解决方案,如Redis或Memcached,配合MyBatis的插件实现分布式缓存。 3. 缓存穿透和缓存雪崩:缓存穿透是指查询的...

    Mybatis缓存测试示例

    在这个“Mybatis缓存测试示例”中,我们将深入探讨Mybatis的缓存机制,以及如何在实际项目中进行测试。 Mybatis 的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,同一SqlSession内的多次相同查询会复用...

    mybatis二级缓存

    标题中的“mybatis二级缓存”指的是MyBatis框架中的一个重要特性,它是MyBatis缓存机制的一部分,用于提升数据库查询效率。MyBatis一级缓存是SqlSession级别的,而二级缓存则是在整个Mapper配置范围内的全局缓存,...

    从0到1项目搭建-集成 Redis 配置MyBatis二级缓存

    基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Redis、Druid、Logback ,并使用 Redis 配置 MyBatis 二级缓存。

    mybatis的讲课笔记, 包含mybatis的缓存,配置等

    MyBatis缓存机制 MyBatis 提供了一级缓存和二级缓存两种缓存机制来优化数据的读取性能。 - **一级缓存**: 由 MyBatis 自身维护,也称为本地缓存,它的作用范围是同一个 `SqlSession` 内。在一个 `SqlSession` 中,...

Global site tag (gtag.js) - Google Analytics