mybatis缓存之二级缓存

mybatis缓存之二级缓存,第1张

概述二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存。 工作机制: 一个会话,查询一条数据,这条数据会放在当前会话的一级缓存中; 如果会话关闭,该会话对应的一

二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存。

工作机制:

一个会话,查询一条数据,这条数据会放在当前会话的一级缓存中;如果会话关闭,该会话对应的一级缓存就消失了;可以使用二级缓存将保存之前的一级缓存,新的会话要查询相同的信息就可以从二级缓存中获取。

使用过程:

开启二级缓存全局配置;<setting name="cacheEnabled" value="true"/>在mapper.xml配置使用二级缓存<cache></cache>POJO需要实现序列化接口@H_301_25@<setting name="lazyLoadingEnabled" value="true"/>@H_301_25@mapper namespace="com.gong.mybatis.dao.EmployeeMapper"> cache eviction="FIFO" flushInterval="60000" Readonly="false" size="1024"> <!-- eviction:缓存的回收策略,默认LRU flushInterval:缓存刷新间隔,默认不清空,可以设置一个毫秒值 Readonly:只读为true,所有从缓存中获取 *** 作都是只读 *** 作,不会修改数据,直接将数据在缓存中的引用交给用户; 非只读,获取的数据可能会被修改,会利用序列化&反序列化的技术克隆一份新的数据,安全,但速度慢。 size:缓存存放多少元素 type:指定自定义缓存的全类名,实现Cache接口即可 --> </cache> ......mapper>@H_301_25@public class Employee implements Serializable

测试:

@H_301_25@package com.gong.mybatis.test;import java.io.IOException; java.io.inputStream; java.util.ArrayList; java.util.Arrays; java.util.HashMap; java.util.List; java.util.Map; org.apache.ibatis.io.Resources; org.apache.ibatis.session.sqlSession; org.apache.ibatis.session.sqlSessionFactory; org.apache.ibatis.session.sqlSessionFactoryBuilder; org.junit.Test; com.gong.mybatis.bean.Department; com.gong.mybatis.bean.Employee; com.gong.mybatis.dao.EmployeeMapper; com.gong.mybatis.mapper.EmployeeMapperDynamicsql;class TestMybatis4 { public sqlSessionFactory getsqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; inputStream is = Resources.getResourceAsstream(resource); return new sqlSessionFactoryBuilder().build(is); } @Test voID test() IOException { sqlSessionFactory sqlSessionFactory = getsqlSessionFactory(); sqlSession openSession = sqlSessionFactory.openSession(); sqlSession openSession2 = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.); EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.); Employee em = mapper.getEmpByID(1); System.out.println(em); openSession.close(); Employee em2 = mapper2.getEmpByID(1); System.out.println(em2); openSession.close(); } finally { // Todo: handle finally clause } } }

输出:

@H_301_25@DEBUG 01-22 10:59:28,726 Cache Hit Ratio [com.gong.mybatis.dao.EmployeeMapper]: 0.0 (LoggingCache.java:62) DEBUG 01-22 10:59:29,055 ==> Preparing: select ID,last_name lastname,email,gender from tbl_employee where ID = ? (BaseJdbcLogger.java:145) DEBUG 01-22 10:59:29,102 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:59:29,148 == Total: 1 (BaseJdbcLogger.java:145) Employee [ID=1,lastname=dema,1)">genderemail[email protected],1)">dept=null]DEBUG 01-22 10:59:29,242 Cache Hit Ratio [com.gong.mybatis.dao.EmployeeMapper]: 0.5 (LoggingCache.java:62) Employee [ID=null]

需要注意是要在第一个会话结束之后要先关闭,否则如果在最后一起关闭,就变成一级缓存的情况了。

和缓存相关的设置:

cacheEnabled:true为开启二级缓存每个select标签都有useCache属性,该属性默认为true,如果置为false,表明不使用二级缓存每个增删改标签都有flushCache属性,该属性默认为true,执行后清除缓存。(一级缓存、二级缓存都会被清空)每个select标签也有flushCache属性,默认为falsesqlSession.clearCache()只清除一级缓存localCacheScope设置:本地缓存作用域,取SESSION表明一级缓存:当前会话的所有数据保存在会话缓存中。取STATEMENT可以禁用一级缓存。 总结

以上是内存溢出为你收集整理的mybatis缓存之二级缓存全部内容,希望文章能够帮你解决mybatis缓存之二级缓存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1218963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存