mybatis的缓存问题
一、缓存的优缺点
1.优点:减少数据库的读操作,降低数据库压力,加快响应速度
2.缺点:可能造成数据不一致问题,增加成本
二、mybatis的一级缓存
2.1.1一级缓存的特点
1.一级缓存是默认开启的
2.一级缓存默认是SqlSession级别的
2.1.2 一级缓存失效方式
1. 使用sqlSession.clearCache()刷新缓存
2. 关闭SqlSession之后重新打开
3. SqlSession执行增删改之后会清空缓存
三、二级缓存
3.1.1 二级缓存的特点
1.二级缓存是需要手动开启的
2.二级缓存是SqlSessionFactory级别的
3.1.2 二级缓存的使用
1.首先需要在mybatis-config.xml配置文件中开启二级缓存
<settings>
<setting name="cacheEnable" value="true"></setting>
</settings>
2.在mapper映射文件中添加标签
<mapper>
<cache/>
</mapper>
<!--开启成功的标志是-->
Cache Hit Ratio [com.im.mapper.UserMapper]: 0.0
<cache/>标签中属性的介绍:
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
eviction: 缓存的回收策略
—>LRU – 最近最少使用的:移除最长时间不被使用的对象
—>FIFO – 先进先出: 按对象进入缓存的顺序来移除它们
—>SOFT – 软引用: 移除基于垃圾回收器状态和软引用规则的对象
—>WEAK – 弱引用: 更积极地移除基于垃圾收集器状态和弱引用规则的对象
flushInterval: 刷新间隔,默认不刷新,可以设置任意的正整数,毫秒数
size: 引用数目->可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目,默认值是1024。
readOnly: 是否只读默认是false->只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(映射数据库的实体类必须实现序列化) 。这会慢一些,但是安全,因此默认是 false
四、集成第三方cache缓存
使用该缓存的步骤
-
添加依赖
ehcache-2.10.4.jar mybatis-ehcache-1.0.0.jar
-
添加ehcache产品配置文件ehcache.xml并且配置
在SQL map 文件中配置<cache/>标签 <cache type="org.mybatis.caches.ehcache.EhcacheCache"> <!-- 缓存创建以后,最后一次访问缓存,间隔多久缓存失效(单位s) --> <property name="timeToIdleSeconds" value="3600"/> <!-- 缓存创建日期起到失效时的时间间隔(单位s) --> <property name="timeToLiveSeconds" value="3600"/> <!-- 堆内存中缓存对象数(0:没有限制) --> <property name="maxEntriesLocalHeap" value="1000"/> <!-- 磁盘中的对象数,默认为0不限制 --> <property name="maxEntriesLocalDisk" value="1000000"/> <!-- 内存存储与释放策略(FIFO:先进先出,LFU:一直以来最少被使用的,LRU:最近最少使用的) --> <property name="memoryStoreEvictionPolicy" value="LRU"/> </cache>
RU:最近最少使用的) -->