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

Mybatis Cache探究

 
阅读更多

 

这里先不讨论第三方的cache集成(有memcache/oscache集成,控制力度跟下面说的一样比较粗,也可以跟spring3的cache做集成, spring3的cache是基于方法的缓存,具体可以在github找一下Spring MyBatis Memcached Bootstrap)。

 

先使用最简单的配置cache,比较粗放:

 

一,官方手册

http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html#cache

<cache/>

字面上看就是这样。这个简单语句的效果如下:

  • 映射语句文件中的所有 select 语句将会被缓存。
  • 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
  • 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
  • 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
  • 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
  • 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

所有的这些属性都可以通过缓存元素的属性来修改。比如:

 

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

 

 

最重要的是readonly=ture, 说明cache对象只读,update的时候,cache不会更新!那么换个角度来说,

其实代表了发生任何insert,update,delete操作的时候,会全量清理cache数据,确保一致性。

 

如果readonly=false的时候,就比较好玩了,更新数据会写入新的cache,并且DO对象要实现序列化

[08/22 11:58:27][main] DEBUG org.apache.ibatis.cache.decorators.LoggingCache55: Cache Hit Ratio [com.xx.dao.UserMapper]: 0.25

 

[08/22 11:58:27][main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils110: Fetching JDBC Connection from DataSource

 

二。测试代码

 

  流程是:

1.select id= 10035L,10036L的,数据

2.立即再查询10035L,cache命中

3.更新10035L数据

4.再查询10036L,cache未能命中

 

也就是说cache是全量清理的

 

/**
 * 测试cache的读取和更新
 * @author weisong
 *
 */
public class MybatisCacheTest {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("spring-core.xml","spring-task.xml","spring-jms.xml");
		UserMapper u = (UserMapper)ac.getBean("userMapper");
		User u0 = u.selectByPrimaryKey(10035L);  //sql
		System.out.println("u0-name="+u0.getNickname());
		User u00 = u.selectByPrimaryKey(10035L); //cache here! DEBUG org.apache.ibatis.cache.decorators.LoggingCache55: Cache Hit Ratio [com.xx.dao.UserMapper]: 0.0
		System.out.println("u00(cache)-name="+u00.getNickname());

		User u1 = u.selectByPrimaryKey(10036L);
		u0.setNickname("wei");
		u.updateByPrimaryKey(u0); //update here
		
		User u01 = u.selectByPrimaryKey(10035L);
		System.out.println("u01-name="+u01.getNickname()); //should no cache, next will cache

		User u11 = u.selectByPrimaryKey(10036L);
		System.out.println("u11-name="+u11.getNickname()); //!!!sql , no cache here

		
	}
}

 

 

展开来继续说:

1.默然cache非常适合读多写少的小数据量级表;大数据量级很有可能cache重建的时候直接雪崩

分享到:
评论

相关推荐

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.zip)

    - MyBatis 提供了本地缓存(Local Cache)和二级缓存(Second Level Cache),可以有效提高数据读取效率。缓存策略可配置,支持读写分离和清空操作。 9. **插件支持** - MyBatis 允许开发者自定义插件,拦截特定...

    2017_尚硅谷MyBatis最新视频

    - **Cache** 用于提高查询效率,MyBatis 提供了二级缓存机制。 - 一级缓存默认开启,二级缓存需要显式启用。 ### 四、MyBatis源码级学习路径建议 1. **基础篇**:首先了解 MyBatis 的基本使用方法,熟悉其配置文件...

    MyBatis拦截器原理探究

    &lt;plugin interceptor="org.format.mybatis.cache.interceptor.ExamplePlugin"&gt; ``` 这个拦截器拦截Executor接口的update方法(其实也就是SqlSession的新增,删除,修改操作),所有执行executor的update方法都会被...

    MyBatis3 中文版用户指南手册

    用户可以通过实现 `Cache` 接口来创建自己的缓存实现。 #### 参照缓存 在某些情况下,可以使用现有的缓存实现作为基础,通过配置来调整其行为。 #### 动态 SQL MyBatis 支持动态 SQL 的编写,这允许在运行时根据...

    Mybatis源码分析

    本文将对Mybatis的源码进行分析,探究其运行原理、缓存机制和设计模式。 Mybatis简介 Mybatis是一个第一类持久化框架,支持自定义SQL、存储过程和高级映射。Mybatis可以消除几乎所有的JDBC代码和手动设置参数和...

    MyBatis3用户指南中文版

    其中涵盖了如何通过XML配置文件创建SqlSessionFactory,使用SqlSessionFactory获取SqlSession,以及如何探究SQL映射语句等基础知识。同时,也讲述了MyBatis的作用域和生命周期,包括SqlSessionFactoryBuilder、...

    mybatis.zip

    本探究程序旨在深入理解MyBatis的核心概念、主要功能以及实际应用场景,帮助开发者提升数据库操作的效率和灵活性。 首先,MyBatis 提供了一个简单灵活的XML或注解方式来配置SQL语句,这使得SQL与代码紧密耦合,提高...

    mybatis使用

    - **使用自定义缓存**:可以通过实现 `Cache` 接口来自定义缓存逻辑。 - **参照缓存**:可以通过引用其他映射器的缓存来实现缓存的复用。 #### 十三、动态 SQL MyBatis 提供了一系列标签用于支持动态 SQL: - **...

    Mybatis3用户指南中文版.pdf

    4. **探究 SQL 映射语句** SQL映射语句是MyBatis的核心部分,定义在XML配置文件中,包括插入、更新、删除和查询等操作。映射语句可以包含动态SQL,根据条件动态生成不同的SQL片段。 5. **作用域和生命周期** - **...

    Mybatis中文教程

    &lt;cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/&gt; ``` #### 十八、动态SQL - **动态SQL**:支持根据条件动态生成SQL语句,包括`if`、`choose(when, otherwise)`、`trim(where, set)`和...

    MyBatis-3-User-Guide-Simplified-Chinese

    探究已映射的 SQL 语句 在 MyBatis 中,SQL 语句通常被映射到配置文件中,这样可以将 SQL 逻辑与 Java 代码分离,提高可维护性。每个映射的 SQL 语句都有一个唯一的命名空间,这有助于避免命名冲突,并且可以使同...

    ognl源码

    - **Expression Cache**:缓存编译后的表达式,避免重复解析和编译,提升性能。 - **Security Manager**:ognl的安全管理器允许控制表达式执行的权限,防止恶意注入。 在阅读源码时,应关注以下主题: 1. **表达式...

Global site tag (gtag.js) - Google Analytics