Mybatis 缓存优点:
1、易于上手和掌握,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验。 2、sql写在xml里,便于统一管理和优化, 解除sql与程序代码的耦合。 3、提供映射标签,支持对象与数据库的orm字段关系映射 4、 提供对象关系映射标签,支持对象关系组建维护5、提供xml标签,支持编写动态sql。 6、速度相对于Hibernate的速度较快
Mybatis 缓存缺点:
1、关联表多时,字段多的时候,sql工作量很大。 2、sql依赖于数据库,导致数据库移植性差。 3、由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。 4、对象关系映射标签和字段映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。 5、DAO层过于简单,对象组装的工作量较大。 6、不支持级联更新、级联删除。 7、Mybatis的日志除了基本记录功能外,其它功能薄弱很多。 8、编写动态sql时,不方便调试,尤其逻辑复杂时。 9、提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。
一级缓存
缓存存在的条件
存在要求 同一个SqlSession中,在没有收到改变该数据的请求之前!
缓存失效的条件
一 并不是同一个Sqlsession对象
二 在查询的过程中,两次的查询条件不同 三 在两次之间进行了增,删,改,操作 四 在两次之间自己进行了手动清空缓存
二级缓存
二级缓存的作用:通过度一级缓存的了解。
一级缓存是基于同一个SqlSesion类的实例对象的。但是,有些时候在wenb工厂中将会执行查询操作的方法分装在某个Service方法中,
当查询完一次后,Service方法结束,此时SqlSession类的实例对象就会关闭, 一级缓存就会被清空。此时若再次调用用Service方法查询同一个信息, 此时一级缓存就是空的,从而无法从缓存中获取信息
因此,我们可以使用二级缓存,二级缓存存在与Mapper实例中, 当多个SqlSession类的实例对象加载相同的mapper文件,并执行其中国的SQL配置时,他们就共享一个Mapper缓存。
当某个SqlSession类的实例对象执行了增,删,改,等改变数据的操作时,Mapper实例都会清空其二级缓存!
开启二级缓存:
第一步:在mybatis的全局配置文件中配置Setting属性,设置名为cacheEnabled的属性值为true即可
第二步:在具体需要二级缓存的mapeer映射文件中开启二级缓存,需要在相应的映射文件中添加一个cache标签即可
可以在开启二级缓存时候,手动配置一些属性
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/> 各个属性意义如下:
eviction:缓存回收策略 - LRU:最少使用原则,移除最长时间不使用的对象 - FIFO:先进先出原则,按照对象进入缓存顺序进行回收 - SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象 - WEAK:弱引用,更积极的移除移除基于垃圾回收器状态和弱引用规则的对象 flushInterval:刷新时间间隔,单位为毫秒,这里配置的100毫秒。如果不配置,那么只有在进行数据库修改操作才会被动刷新缓存区 size:引用额数目,代表缓存最多可以存储的对象个数 readOnly:是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),如果设置为false,则相同的sql,后面访问的是cache的clone副本。 可以在Mapper的具体方法下设置对二级缓存的访问意愿:
useCache配置
? 如果一条语句每次都需要最新的数据,就意味着每次都需要从数据库中查询数据,可以把这个属性设置为false,如:
<select id="selectAll" resultMap="BaseResultMap" useCache="false"> 刷新缓存(就是清空缓存)
? 二级缓存默认会在insert、update、delete操作后刷新缓存,可以手动配置不更新缓存,如下:
<update id="updateById" parameterType="User" flushCache="false" />