Mybatis Cache 缓存策略

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持

  1. 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
  2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
  3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。
一级缓存的验证:

@Test
public void testLevel1Cache()
{
SqlSession sqlSession = MybatisUtil.getSqlSession();
String statement = "src.lyb.resources.mapper.studentMapper.getStudent"; Student student1 = sqlSession.selectOne(statement,1);
System.out.println(student1); student1 = sqlSession.selectOne(statement, 1);
System.out.println(student1);
sqlSession.close(); sqlSession = MybatisUtil.getSqlSession();
student1 = sqlSession.selectOne(statement, 1);
System.out.println(student1); student1 = sqlSession.selectOne(statement, 4);
System.out.println(student1); student1 = sqlSession.selectOne(statement, 4);
System.out.println(student1); sqlSession.update("src.lyb.resources.mapper.studentMapper.updateStudent",
new Student(4,"tmd", 50, "angry"));
student1 = sqlSession.selectOne(statement, 4); System.out.println(student1); }

这里得到的执行结果是:


Student{student_id=1, student_name='lyb', student_grade=100, student_issue_name='lazy'}
Student{student_id=1, student_name='lyb', student_grade=100, student_issue_name='lazy'} Student{student_id=1, student_name='lyb', student_grade=100, student_issue_name='lazy'}
Student{student_id=4, student_name='lll', student_grade=22, student_issue_name='angry'}
Student{student_id=4, student_name='lll', student_grade=22, student_issue_name='angry'}
Student{student_id=4, student_name='tmd', student_grade=50, student_issue_name='angry'}

而真实数据库的内容是:

1	lyb	100	lazy
4 lll 22 angry

可以看出数据库和查询的结果不一致了, 如果做了sqlSession的commit()或者是close(), 数据库才会和返回值一致.

二级缓存的验证

开启二级缓存,在studentMapper.xml文件中添加如下配置

<mapper namespace="src.lyb.resources.mapper.studentMapper">
<cache/>

测试文件为:

	@Test
public void testLevel2Cache()
{
String statement = "src.lyb.resources.mapper.studentMapper.getStudent";
SqlSessionFactory factory = MybatisUtil.getSqlSessionFactoy(); //开启两个不同的SqlSession
SqlSession sqlSession1 = factory.openSession();
SqlSession sqlSession2 = factory.openSession(); Student student = sqlSession1.selectOne(statement, 1);
sqlSession1.commit(); //不懂为啥,这个地方一定要提交事务之后二级缓存才会起作用
System.out.println("user="+student); //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用
student = sqlSession2.selectOne(statement, 1);
//session2.commit();
System.out.println("user2="+student); }

这里比较奇怪, 如果查询过马上commit(), 其实只有一个sqlSession真正在工作, 但是如果不commit(), 就是两个session.

<cache eviction="FIFO"  <!--回收策略为先进先出-->
flushInterval="60000" <!--自动刷新时间60s-->
size="512" <!--最多缓存512个引用对象-->
readOnly="true"/> <!--只读-->

常用的cache属性.

  1. 映射语句文件中的所有select语句将会被缓存。

  2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。

  3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。

  4. 缓存会根据指定的时间间隔来刷新。

  5. 缓存会存储1024个对象

Mybatis Cache 缓存策略的更多相关文章

  1. mybatis 使用缓存策略

    mybatis中默认开启缓存 1.mybatis中,默认是开启缓存的,缓存的是一个statement对象. 不同情况下是否会使用缓存 同一个SqlSession对象,重复调用同一个id的<sel ...

  2. MyBatis缓存策略

    MyBatis 提供了一级缓存和二级缓存策略,一级缓存是作用在SqlSession级别上的,而二级缓存则是作用在Mapper级别上的( 即作用在 namespace上),MyBatis 默认是开启的一 ...

  3. ASIHTTPRequest缓存策略download cache

    本文为大家介绍了iOS开发ASIHTTPRequest使用download cache的内容,其中包括cache策略,存储策略,其他cache相关的特性,编写自己的cache等等内容. 从1.8版本开 ...

  4. Mybatis 缓存策略

    听极客学院笔记 使用mybatis的缓存需要以下三步 一.在mybatis的config.xml中开启缓存 <settings> <setting name="cacheE ...

  5. ASP.NET Cache 实现依赖Oracle的缓存策略

    ASP.NET 中的缓存提供了对SQL依赖项的支持,也就是说当SQL SERVER数据库中的表或行中的数据被更改后,缓存中的页面就失效,否则,页面输出可一直保留在缓存当中.这确实为程序员提供了方便.但 ...

  6. mybatis 自定义缓存 cache

    缓存不管哪个框架都是显得特别的重要,今天自己测试实现了mybatis自定义缓存,从而理解mybatis缓存的工作原理. 首先缓存类要实现Cache接口:具体实现如下package com.ibatis ...

  7. MyBatis Cache配置

    @(MyBatis)[Cache] MyBatis Cache配置 MyBatis提供了一级缓存和二级缓存 配置 全局配置 配置 说明 默认值 可选值 cacheEnabled 全局缓存的开关 tru ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...

  9. mybatis一级缓存二级缓存

    一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...

随机推荐

  1. Asset Catalog Help (十一)---Removing Images and Sets

    Removing Images and Sets Optimize the size of an asset catalog by removing unused images or sets. 通过 ...

  2. sql语句之查询操作

    语法顺序: select distinct 字段1,字段2,字段3 from 库.表 where 条件 group by 分组条件 having 过滤 # 执行顺序的话,到这步会返回运行select语 ...

  3. 转载 关于启用HTTPS的一些经验分享

    本文转载自  https://imququ.com/post/sth-about-switch-to-https.html 随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站 ...

  4. 51nod 1049【经典】

    自己模拟,全靠体会~ #include <cstdio> #include <stack> #include <iostream> #include <str ...

  5. 萌新学习图的强连通(Tarjan算法)笔记

    --主要摘自北京大学暑期课<ACM/ICPC竞赛训练> 在有向图G中,如果任意两个不同顶点相互可达,则称该有向图是强连通的: 有向图G的极大强连通子图称为G的强连通分支: Tarjan算法 ...

  6. 小程序隐藏或自定义 scroll-view滚动条

    css 隐藏滚动条 ::-webkit-scrollbar { width:; height:; color: transparent; } 自定义滚动条样式 ::-webkit-scrollbar ...

  7. laravel C层 (控制器)

    <?php namespace App\Http\Controllers; use App\Index; use App\Http\Controllers\Controller; class I ...

  8. unity surface shader 1

    Unity ShaderLib :  CGPROGRAM  ENDCG之间是CG代码,之外的代码功能都由ShaderLib提供,CG中的一些方法比如tex2D(...)也是ShaderLib对CG进行 ...

  9. editplus 3.4注册码,亲测有效

    注册码: crsky 7879E-5BF58-7DR23-DAOB2-7DR30

  10. Eclipse - 安装了jd-eclipse插件后依然无法反编译类文件

    问题 Eclipse在安装了jd-eclipse插件后依然无法反编译类文件,这个问题是因为没有修改默认的类文件查看器. 解决方法 修改默认的类文件查看器为jd-eclipse Window -> ...