龙空技术网

「MyBatis学习笔记八」——MyBatis缓存

码上云端 69

前言:

眼前咱们对“java生成临时文件不写磁盘 写内存”大致比较关心,兄弟们都想要学习一些“java生成临时文件不写磁盘 写内存”的相关内容。那么小编同时在网摘上收集了一些有关“java生成临时文件不写磁盘 写内存””的相关知识,希望小伙伴们能喜欢,咱们一起来了解一下吧!

1.Mybatis一级缓存一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或close 之后,该Session中的所有 Cache 就将清空一级缓存的生命周期有多长?(1).MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。(2).如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;(3).如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;(4).SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;SqlSession 一级缓存的工作流程:(1).对于某个查询,根据statementId,params,rowBounds来构建一个key值,根据这个key值去缓存Cache中取出对应的key值存储的缓存结果(2).判断从Cache中根据特定的key值取的数据数据是否为空,即是否命中;(3).如果命中,则直接将缓存结果返回;(4).如果没命中:去数据库中查询数据,得到查询结果;将key和查询到的结果分别作为key,value对存储到Cache中;将查询结果返回;测试

    @Test    public void TestOneLevelCache(){        //获取SqlSession        SqlSession sqlSession = MybatisUtil.getSqlSession();        ///获取UserMapper        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);        //调用方法        //一级缓存默认就会被使用        User user1 = userMapper.getOneById(6);        System.out.println(user1);        //sqlSession.close();        //1.必须是同一个Session,如果session对象已经close()过了就不可能用了        //2.查询条件是一样的,        //3.没有执行过增删改的操作(这些操作都会清理缓存)        //4.没有执行过session.clearCache()清理缓存        User user2 = userMapper.getOneById(6);        System.out.println(user2);        //关闭SqlSession        sqlSession.close();    }
2.Mybatis二级缓存二级缓存:与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 ehcache。二级缓存是用来解决一级缓存不能跨会话共享的问题的,范围是namespace 级别的,可以被多个SqlSession 共享(只要是同一个接口里面的相同方法,都可以共享),生命周期和应用同步。MyBatis查询数据的顺序是:二级缓存 —> 一级缓存 —> 数据库。开启二级缓存
<mapper namespace="com.demo.mapper.UserMapper">    <!-- 开启二级缓存 -->    <cache/>    <select id="getOneById" resultType="com.demo.entity.User" parameterType="int">       select * from mybatis.user where id = #{id}     </select></mapper>
测试
    @Test    public void TestTwoLevelCache(){        //开启两个不同的SqlSession        SqlSession sqlSession1 = MybatisUtil.getSqlSession();        SqlSession sqlSession2 = MybatisUtil.getSqlSession();        //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用        UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);        UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);        //使用二级缓存时,User类必须实现一个Serializable接口===> User implements Serializable        User user1 = userMapper1.getOneById(6);        System.out.println(user1);        sqlSession1.commit();//这个地方一定要提交事务之后二级缓存才会起作用        User user2 = userMapper2.getOneById(6);        System.out.println(user2);        //关闭SqlSession        sqlSession1.close();        sqlSession2.close();    }
cache标签常用属性<cache eviction="FIFO" <!--回收策略为先进先出--> flushInterval="60000" <!--自动刷新时间60s--> size="512" <!--最多缓存512个引用对象--> readOnly="true"/> <!--只读-->3.Mybatis自定义缓存——ehcache导入ehcache依赖
<!--  --><dependency>    <groupId>org.mybatis.caches</groupId>    <artifactId>mybatis-ehcache</artifactId>    <version>1.1.0</version></dependency>
配置使用ehcache
<!--配置使用ehcache--><cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
在resource中定义配置文件 ehcache.xml
<?xml version="1.0" encoding="UTF-8" ?><ehcache xmlns:xsi=";         xsi:noNamespaceSchemaLocation="; updateCheck="false">    <!--    diskStore: 缓存路径, ehcache分为内存和磁盘两级, 此属性定义磁盘的缓存位置    参数:    user.home - 用户主目录    user.dir - 用户当前工作目录    java.io.tmpdir - 默认临时文件路径    -->    <!--当二级缓存的对象 超过内存限制时(缓存对象的个数>maxElementsInMemory),存放入的硬盘文件  -->    <diskStore path="./tempdir/Tmp_Ehcache"/>    <!--default 默认缓冲策略, 当ehcache找不到定义的缓存时, 则使用这个缓存策略, 这个只能定义一个-->    <defaultCache        eternal="false"        maxElementsInMemory="10000"        overflowToDisk="false"        diskPersistent="false"        timeToIdleSeconds="1800"        timeToLiveSeconds="259200"        memoryStoreEvictionPolicy="LRU"/>        <cache        name="cloud_user"        eternal="false"        maxElementsInMemory="5000"        overflowToDisk="false"        diskPersistent="false"        timeToIdleSeconds="1800"        timeToLiveSeconds="1800"        memoryStoreEvictionPolicy="LRU"/>    <!--       maxElementsInMemory:设置 在内存中缓存 对象的个数       maxElementsOnDisk:设置 在硬盘中缓存 对象的个数       eternal:设置缓存是否 永远不过期       overflowToDisk:当系统宕机的时候是否保存到磁盘上       maxElementsInMemory的时候,是否转移到硬盘中       timeToIdleSeconds:当2次访问 超过该值的时候,将缓存对象失效       timeToLiveSeconds:一个缓存对象 最多存放的时间(生命周期)       diskExpiryThreadIntervalSeconds:设置每隔多长时间,通过一个线程来清理硬盘中的缓存       clearOnFlush: 内存数量最大时是否清除       memoryStoreEvictionPolicy:当超过缓存对象的最大值时,处理的策略;LRU (最少使用),FIFO (先进先出), LFU (最少访问次数)     --></ehcache>
4.demo地址

标签: #java生成临时文件不写磁盘 写内存 #java临时文件处理