Mybatis缓存机制

Mybatis缓存机制

一.什么是Mybatis的缓存机制

缓存的概念简而言之就是临时存放在本机的数据。为什么需要缓存机制呢,因为链接数据库的资源很珍贵,而且如果每次查询数据都需要访问数据库的话会很费时,且效率不高,于是就有了缓存的机制。有了缓存机制,由原来的 请求-->数据库 到  请求-->缓存(是否有数据? 数据:请求数据库).

Mybatis分两级缓存:为一级缓存和二级缓存!

1.一级缓存

一级缓存是基于 PerpetualCache(mybatis自带)HashMap本地缓存,作用范围为session,session是一次会话(从请求到访问数据库到返回数据,直至请求结束称之为一次会话),所以当session commit或cleanCache后,缓存就会被清空.一级缓存是Mybatis自带,并自动开启的。其数据存储关系如下图:

测试代码:

Users  user=session.selectOne(sql,1);
 // session.commit();   //提交两个sql 执行,否则一个 sql 

  Users  user1=session.selectOne(sql,1);   两条sql   
  System.out.println(user.getName());

结果:

DEBUG - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - Opening JDBC Connection
DEBUG - Created connection 1725097945.
DEBUG - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@66d2e7d9]
DEBUG - ==>  Preparing: select o.*,u.name,u.age from users u join myorder o on o.id=u.id where o.id=? 
DEBUG - ==> Parameters: 1(Integer)
DEBUG - <==      Total: 1

2.二级缓存

二级缓存缓存的是结果对象,独立于session,作用范围为所有namespace定义的方法,其存储在Mybatis中的内存空间中,作用结构图如下:


二级缓存需要自己配置并开启,需要走三大步:

一.在config配置文件加入如下代码(开启缓存):

<settings>
 		<setting name="cacheEnabled" value="true"/>
 	</settings>

二.在mapper映射文件中加入便签:

1.最简单写法:

<cache/>

2.带点参数eviction是驱逐,FIFO是先进先出分方式,flushInterval是刷新的间隔以秒为单位。


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

三.编写代码,完了后session一定要commit无论是查还是增删改。

3.一级缓存与二级缓存的区分

1.一级缓存缓存在session内部,与session息息相关,二级缓存独立于session,作用范围为整个namespace

2.一级缓存是自动开启的,二级缓存要实现3大步骤,手动开启

3.一级缓存存在session中,当session调用commit或cleanCache数据就会被清除,二级缓存存在Mybatis的内存中,不受影响,只有当虚拟机被关闭才会丢失数据.

结语:每个人都会有一段孤独的时间,或长或短,我只是选择了最长的那条路!!!






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章