这里先不讨论第三方的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重建的时候直接雪崩
相关推荐
MybatisEhcache demo 导入即可使用
mybatis缓存增强插件,提供细粒度管理缓存的功能
redis做mybatis的缓存,可以直接拿来用
springboot+redis+springcache测试项目,数据库连接使用mybatis,数据库使用mysql,test文件夹下为自动生成javaBean方法
spring-boot-mybatis-cache-thymeleaf框架组合练习学习做的一个完整的精简的小demo项目源码
Mybatis-ehcache 1.2.1源码(ehcache-cache-mybatis-ehcache-1.2.1.zip)
Mybatis-ehcache 1.2.1源码(ehcache-cache-mybatis-ehcache-1.2.1.tar.gz)
springmvc最全的配置文件资料,springMVC包含json、xml、文件下载、静态资源配置、日志拦截器、freeMarker、错误日志、国际化等各种配置
mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例...
mybatis源码是mybatis-3.2.6的源码,用户使用mybatis时可以进行参考
mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis...
mybatis deom.mybatis 的简单入门实例。基于maven开发的。
开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2...
mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的...
在上个资源myBatis001的基础上,加了缓存和动态sql的编写方式。。。。。。。。。。。。。。。。。。
mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip ...
解决mybatis头文件报错 下载好压缩包 解压将文件放到本地文件夹 例如 D盘的哪个文件夹 D:\mybatis\ ;然后打开eclipse ->Window->prefenrence->XML->XML Catalog->User Specifiled Entreis->Add->Location(此处是你...
mybatis、mybatis详细设计、mybatis配置
基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Redis、Druid、Logback ,并使用 Redis 配置 MyBatis 二级缓存。
生成已tk.mybatis封装的mybatis代码