现在开始实现代码
把student类中重写的tostring方法取消后,然后在查询第一次后,关闭一下sqlsession再次查询,发现两次的传过来的哈希值不一样,证明进行了两次查询
tostring方法: getClass().getName() + \’@\’ + Integer.toHexString(hashCode())
在关闭了sqlsession的情况下调用两次相同代码
此时看见sql语句调用了两次,且两次哈希值不同
在没有关闭sqlsession情况下调用两次相同代码:
可以看到只是调用了一次sql语句,且哈希值相同
一级缓存总结:
1.一级缓存和sqlsession生存周期相同
2.一级缓存是Mybaitis中sqlsession对象的缓存,当使用SQL session的修改,添加删除,commit(),close()等方法时候,会清空一级缓存
3.证明:一级缓存中存放的不是查询出的对象本身,而是一个map
key:hashCode + statementId + SQL语句
value:查询结果本身
开启二级缓存的方法:
二级缓存的使用步骤:
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在select标签中配置)
1.在老师讲的是mybaitis.xml文件中
<settings>
<setting name=\”cacheEnabled\” value=\”true\”/>
</settings>
2.在映射文件中加上<cache/>标签
<!–在该namespace范围内打开二级缓存–>
<cache size=\”512\” eviction=\”LRU\” flushInterval=\”100000\”/>
其中
3.在所需要二级缓存的查询语句中加上useCache=\”false\”
eviction:缓存的回收策略
LRU – 最近最少使用,移除最长时间不被使用的对象
FIFO – 先进先出,按对象进入缓存的顺序来移除它们
SOFT – 软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK – 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象
默认的是LRU
flushInterval:缓存刷新间隔
缓存多长时间清空一次,默认不清空,设置一个毫秒值
readOnly:是否只读
true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
mybatis为了加快获取数据,直接就会将数据在缓存中的引用交给用户 。不安全,速度快
false:读写(默认):mybatis觉得获取的数据可能会被修改
mybatis会利用序列化&反序列化的技术克隆一份新的数据给你。安全,速度相对慢
size:缓存存放多少个元素
type:指定自定义缓存的全类名(实现Cache接口即可)
二级缓存总结:
他指的是Mybatis中sqlsessionFactory对象的的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存中存放的是数据,而不是对象,所以两次取出来相同的数据哈希值并不相等。
这就是今天缓存的总结了,如果大家有没有提到的知识点或者小狼哪里写错了的话可以在下方留言交流哦!