Mybatis补充

Mybatis中使用的设计模式

1)建造者模式

Builder模式应用1: SqlSessionFactory的创建

SqlSessionFactoryBuilder :SqlSessionFactory的构造器,用于创建SqlSessionFactory,采用了建造者模式

Builder模式应用2:数据库连接环境Environment对象的创建

2)工厂模式

SqlSessionFactory:SqlSession工厂类,以工厂形式创建SqlSession对象,采用了Factory工厂设计模式

public SqlSessionFactory build(Configuration config)
{  
      return new DefaultSqlSessionFactory(config);  
}  

3)装饰模式

当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。

4)责任链模式

执行插件时候,使用了责任链模式

一级缓存的性能分析

1. MyBatis对会话(Session)级别的一级缓存设计的比较简单,就简单地使用了HashMap来维护,并没有对HashMap的容量和大小进行限制,

存在问题: 如果一直使用某一个SqlSession对象查询数据,这样会不会导致HashMap太大,而导致
java.lang.OutOfMemoryError错误

MyBatis这样设计也有它自己的理由:

a. 一般而言SqlSession的生存时间很短。一般情况下使用一个SqlSession对象执行的操作不会太多,执行完就会消亡;

b. 对于某一个SqlSession对象而言,只要执行update操作(update、insert、delete),都会将这个SqlSession对象中对应的一级缓存清空掉,所以一般情况下不会出现缓存过大,影响JVM内存空间的问题;

c. 可以手动地释放掉SqlSession对象中的缓存。

2. 一级缓存是一个粗粒度的缓存,没有更新缓存和缓存过期的概念

MyBatis的一级缓存就是使用了简单的HashMap,MyBatis只负责将查询数据库的结果存储到缓存中去, 不会去判断缓存存放的时间是否过长、是否过期,因此也就没有对缓存的结果进行更新这一说了。

根据一级缓存的特性,在使用的过程中,应该注意:

  1. 对于数据变化频率很大,并且需要高时效准确性的数据要求,我们使用SqlSession查询的时候,要控制好SqlSession的生存时间,SqlSession的生存时间越长,它其中缓存的数据有可能就越旧,从而造成和真实数据库的误差;同时对于这种情况,用户也可以手动地适时清空SqlSession中的缓存;

  2. 对于只执行、并且频繁执行大范围的select操作的SqlSession对象,SqlSession对象的生存时间不应过长。

发布了45 篇原创文章 · 获赞 3 · 访问量 2300

猜你喜欢

转载自blog.csdn.net/weixin_44046437/article/details/100527044
今日推荐