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. c++中编译链接总结

    1 编译链接过程分为 预处理--->编译---->汇编---->链接.如下图所示 2 预处理都做了什么 (1)将所有的#define删除并展开所有的宏 (2)处理所有的条件预编译指令 ...

  2. TypeScript完全解读(26课时)_9.TypeScript完全解读-TS中的类

    9.TypeScript完全解读-TS中的类 创建class.ts文件,并在index.ts内引用 创建一个类,这个类在创建好后有好几个地方都标红了 这是tslint的一些验证规则 一保存就会自动修复 ...

  3. 大将军UE分析

    1.过关奖励,先播放特效,在显示奖励 2.鼠标移到人物身上装备,提示双击卸载 3.战场随机事件,出发开启增加buff 4.主线任务简单化,副本支线可玩性增强 5.乌泱泱几十个活动 6.升级的爽快感[升 ...

  4. CodeForces 600C【构造】

    题意: 在原字符串中修改数量最少,然后保证最小字典序. #include <bits/stdc++.h> using namespace std; typedef long long LL ...

  5. NDK环境搭建(Native Code的编译,不需要Cygwin)

    分类: android2013-06-21 15:49 475人阅读 评论(0) 收藏 举报 Android NDK 目录(?)[-] System and Software Requirements ...

  6. 织梦cms 应急响应 修复建议

    通过分析log日志,可以知道攻击者的IP 攻击时间 和具体操作 本片文章为内网测试,通过分析日志,进行复现攻击流程,同时对网站的后门给予修复建议 通过分析日志可以知道,攻击者使用了扫描工具进行网站扫描 ...

  7. Git - .gitignore文件的用法

    .gitignore文件的作用 .gitignore文件用来忽略被指定的文件或文件夹的改动,被记录在.gitignore文件里的文件或文件夹,是无法被git跟踪到的,换句话说,被忽略的文件是不会被放入 ...

  8. jave之set和get的用法

    package com.xxl.api.admin; public class Test { private int score; public int getScore() { return sco ...

  9. JetSpeed2因dom4j包冲突导致PSML页面文件数据丢失

    使用JetSpeed2进行二次开发时突然出现在保存Portlet配置信息时出现PSML页面文件数据丢失的情况,几经测试,最终发现是因为Portlet中的dom4j.jar与jetspeed应用中的do ...

  10. morphia(6-1)-查询

    1.filter morphia语法: query.filter("price >=", 1000); mongodb语法: { price: { $gte: 1000 } ...