没长正的技术专栏 勤动手、多思考

MyBatis架构

2018-05-01

阅读:


一、MyBatis架构

了解MyBatis主要流程,便于快速分析问题,有大局观,从整体来把控、分析。

mybatis 是ORM框架,主要是基于JDBC封装、改造、优化,包括连接池会话namespae缓存映射器处理器等等;我们先了解JDBC的主要执行流程:

2021-11-21_2021-11-21_JDBC主要流程

1. MyBatis主要工作流程

2021-11-21_mybatis主要工作流程

mybatis底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSession Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程

执行器:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

参数处理器: ParameterHandler (getParameterObject, setParameters)

结构处理器: ResultSetHandler (handleResultSets, handleOutputParameters)

sql查询处理器:StatementHandler (prepare, parameterize, batch, update, query)

2. MyBatis核心架构

2021-11-21_mybatis架构

3.MyBatis缓存

mybatis缓存cache接口实现类如下:PerpetualCache(默认)、LruCache、FifoCache、SoftCache、WeakCache等等

2021-11-21_mybatis缓存实现类

3.1 一级缓存(session)

一级缓存基于session,缓存是在SqlSession的executor中;

mybatis默认开启的一级缓存,不需要配置;

新增、更新、删除时,缓存失效。

2021-11-21_mybatis一级缓存图解

一级缓存的不足:不同的会话(SqlSession),相同的查询不会走缓存,需重新查询;在多个会话下或分布式,可能会存在脏数据的情况。

3.2 二级缓存(namespace)

为了解决一级缓存不能跨会话共享问题,范围是namespace级别,缓存可以被多个sqlSession共享。生命周期和应用同步。

二级缓存基于namespae,缓存位于CachingExecutor(Execotr装饰类)中

2021-11-21_mybatis二级缓存图解

如何开启二级缓存?

<!-- 声明这个 namespace 使用二级缓存 --> 
<cache type="org.apache.ibatis.cache.impl.PerpetualCache"         
       size="1024" 
	   eviction="LRU" 
       flushInterval="120000" 
       readOnly="false"/> <!--默认是 false(安全),改为 true 可读写时,对象必须支持序列 化 -->
<!-- 最多缓存对象个数,默认 1024 -->
<!-- LRU回收策略--> 
<!-- 120000 自动刷新时间 ms,未配置时只有调用时刷新--> 

什么场合适用二级缓存?

-- 以查询为主的应用,查询历史订单、消费记录等。

如何跨namespace进行缓存共享?

<cache-ref namespace="com.xx.xxMapper" />
<!--cache-ref 代表引用别的命名空间的 Cache 配置,两个命名空间的操作使用的是同 一个 Cache。-->
<!-- 在这种情况下,多个 Mapper 的操作都会引起缓存刷新,缓存的意义已经不 大了。-->

3.3 三方缓存

redis cache /ehcache ….

参考

MyBatis中文档:https://mybatis.org/mybatis-3/zh/

参考分页:https://www.cnblogs.com/baiyifengyun/p/13756653.html


欢迎拍砖,多多交流,转载请注明出处:[没长正的技术专栏](http://blog.meizhangzheng.com) 如涉及侵权问题,请发送邮件到xsj34567@163.com,如情况属实本人将会尽快删除。


下一篇 MyBatis-Plus架构

Comments

Content