Mybatis缓存的使用 冷不防 2022-08-19 14:19 1阅读 0赞 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存(默认开启)和二级缓存(集成spring时也默认开启)的支持。 1. 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。---值得注意的是,mybatis集成spring时,会把SqlSessionFactory设置为单例注入到IOC容器中,不把sqlsession也设置为单例的原因是sqlsession是线程不安全的,所以不能为单例。那也就意味着其实是有关闭sqlsession的过程的,也就是说一级缓存失效了,不过还有二级缓存。。。 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。 3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。 mybatis 3.x 已经支持cache功能了,使用很简单,在mappper的xml文件里namespace下简单添加节点<cache />即可。当然该节点也可配置相关参数 <cache eviction="FIFO" //回收策略为先进先出 flushInterval="60000" //自动刷新时间60s size="512" //最多缓存512个引用对象 readOnly="true"/> //只读 eviction是缓存的淘汰算法,可选值有"LRU"、"FIFO"、"SOFT"、"WEAK",缺省值是LRU flashInterval指缓存过期时间,单位为毫秒,60000即为60秒,缺省值为空,即只要容量足够,永不过期 size指缓存多少个对象,默认值为1024 readOnly是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),如果设置为false,则相同的sql,后面访问的是cache的clone副本。 上面这个是全局设置,在每条单独的sql语句上,还可以有局部设置,比如: <select id="getOrder" parameterType="int" resultType="TOrder" useCache="false"> 另外附上一篇比较信服的文章:http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html
还没有评论,来说两句吧...