缓存无处不在,一款优秀的ORM框架更是如此!
共 1455字,需浏览 3分钟
·
2021-01-04 18:48
计算机世界中,缓存无处不在,作为一款优秀的ORM框架,MyBatis中当然也少不了缓存。缓存是MyBatis 中非常重要的特性。合理使用缓存能够减少数据库 IO,显著提升系统性能。
在系统代码的运行中,我们可能会在一个数据库会话中,执行多次查询条件完全相同的Sql,鉴于日常应用的大部分场景都是读多写少,这重复的查询会带来一定的网络开销,同时select查询的量比较大的话,对数据库的性能是有比较大的影响。
一级缓存
在 MyBatis 中,Cache 是缓存接口,定义了一些基本的缓存操作,所有缓存类都应该实现该接口。MyBatis 内部提供了丰富的缓存实现类, 比如具有基本缓存功能的PerpetualCache ,具有 LRU 策略的缓存 LruCache ,以及可保证线程安全的缓存。
SynchronizedCache 和具备阻塞功能的缓存 BlockingCache 等。
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
Blog blog2 = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
System.out.println(blog);
System.out.println(blog2);
} finally {
session.close();
}
}
效果:
19:54:28.572 [main] DEBUG org.mybatis.example.BlogMapper.selectBlog - ==> Preparing: select * from Blog where id = ?
19:54:28.593 [main] DEBUG org.mybatis.example.BlogMapper.selectBlog - ==> Parameters: 101(Integer)
19:54:28.613 [main] DEBUG org.mybatis.example.BlogMapper.selectBlog - <== Total: 1
Blog{id=101, username='monkey', context='我要带你飞'}
Blog{id=101, username='monkey', context='我要带你飞'}
缓存的key是如何生成的?
org.apache.ibatis.executor.BaseExecutor#createCacheKey
CacheKey cacheKey = new CacheKey();
cacheKey.update(ms.getId());//id
cacheKey.update(rowBounds.getOffset());//offset
cacheKey.update(rowBounds.getLimit());//limit
cacheKey.update(boundSql.getSql());//sql
缓存的value生成核心源码:
localCache.putObject(key, EXECUTION_PLACEHOLDER);
try {
list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);//查询数据库数据
}
localCache.putObject(key, list);//缓存存储查询结果
缓存如何使用核心源码:
list = resultHandler == null ? (List) localCache.getObject(key) : null;//从缓存里面查询是否存在数据
if (list != null) {
handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);//不为空从缓存里面获取
} else {
list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);//else为空查询数据库
}
大家都知道mybatis是有一级和二级缓存,那二级缓存的源码和使用又怎么玩?给大家看一个源码类图。
Mybatis是目前国内Java web开发的主流ORM框架。作为一名开发者非常有必要掌握其实现原理,更好地解决我们开发中遇到的问题;同时,Mybatis的架构和源码非常优雅,使用了大量的设计模式实现解耦以及高扩展性对其设计思想也需要深入理解。
除了Mybatis之外,与其处在同一重要位置的开源框架还有Spring。比如你是如何理解Spring中的IOC、DI、AOP这些概念的?比如你知道Bean的生命周期吗?说说它有哪些步骤?每个步骤是用来干什么的......
可能你不一定回答好这些问题,最近听了一节Mybatis架构设计与Spring底层源码分析课程。深入底层、剖析源码,值得一学,限时0.02元,扫码即刻抢占
开源框架Mybatis源码如何学习?
Mybatis源码中用到了哪些设计模式?
Mybatis如何获取数据库源
Mybatis如何执行SQL语句,xml和注解的方式差异点
Mybatis结果集处理与结果映射关系源码分析
Mybatis中缓存的作用与不足
一级和二级缓存实现原理,默认先执行是一级缓存还是二级缓存
Mybatis执行器原理深入分析,执行器的区别于源码分析
Mybatis如何改写SQL,为什么要改写sql?
你是如何理解Spring中的IOC、DI、AOP这些概念的,说下你自己的理解
你怎么理解Spring Framework、Spring Boot、Spring Cloud之间的关系
知道Bean的生命周期吗?说说它有哪些步骤?每个步骤是用来干什么的
听说过Spring中的后置处理器吗?说说你的理解
Spring事务是如何实现的?有哪些情况会导致Spring事务失效?为什么会失效
Spring中的AOP什么时候用Cglib,什么时候用JDK动态代理
知道Spring中的循环依赖吗?如果仅仅只用二级缓存来解决,还会出现什么问题?
说说@Autowired、@Resource、@Value、@Inject这几个注解的区别与底层实现
能否说下ApplicationContext的启动流程中做了哪些事情
从设计模式可以有效提升个人编码及设计代码的能力,提高技术能力。告别烂代码,让实现优雅起来,扫码即可0.02元购课,一起学习Mybatis,肝下Spring。
☟☟戳阅读原文也可购课