您的位置:首页 > 其它

Mybatis缓存机制

2016-11-09 21:20 387 查看

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的内存中,不受影响,只有当虚拟机被关闭才会丢失数据.

结语:每个人都会有一段孤独的时间,或长或短,我只是选择了最长的那条路!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Mybatis 缓存机制