前言:
眼前咱们对“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临时文件处理