凯里市网站建设丹麦做网站公司有哪些

当前位置: 首页 > news >正文

凯里市网站建设,丹麦做网站公司有哪些,游戏推广员是做什么的,域名注册个人和企业有什么区别文章目录 一级缓存一级缓存失效 二级缓存二级缓存失效二级缓存相关配置 MyBatis集成EhCache 缓存#xff1a;cache 缓存的作用#xff1a;通过减少IO的方式#xff0c;来提高程序的执行效率 mybatis的缓存#xff1a;将select语句的查询结果放到缓存#xff08;内存cache 缓存的作用通过减少IO的方式来提高程序的执行效率 mybatis的缓存将select语句的查询结果放到缓存内存当中下一次还是这一条select语句的话直接从缓存中取不再查数据库。一方面是减少了IO。另一方面不再执行繁琐的查找算法效率大大提升。 不必担心查询到的数据还是原来的数据而不是实时的数据如果这点小问题还得我们自己做这个框架就是失败的 mybatis缓存包括 一级缓存将查询到的数据存储到SqlSession中。二级缓存将查询到的数据存储到SqlSessionFactory中。或者集成其他第三方的缓存比如EhCache【Java语言开发的】、Memcache【C语言开发的】等. 缓存只针对DQL语句也就是说缓存机制值对应select语句。 拓展 常见的缓存技术手段 字符串常量池整数型常量池线程池连接池and so on 一级缓存 一级缓存是默认开启的不需要做任何配置。 原理只要使用同一个SqlSession对象执行同一条SQL语句就会走缓存 Test public void testSelectById(){SqlSession sqlSession SqlSessionUtil.openSession();CarMapper mapper1 sqlSession.getMapper(CarMapper.class);Car car1 mapper1.selectById(164L);System.out.println(car1);CarMapper mapper2 sqlSession.getMapper(CarMapper.class);Car car2 mapper2.selectById(164L);System.out.println(car2);sqlSession.close(); }通过输出日志可以看出只执行了一条SQL语句 一级缓存失效 第一次DQL和第二次DQL之间做了任意以下两件事情中的一件都会让一级缓存失效 第一种第一次查询和第二次查询之间手动清空了一级缓存 sqlSession.clearCache();第二种第一次查询和第二次查询之间进行了增删改操作。这个增删改和哪张表没有关系只要有insert、delete、update操作一级缓存就失效 二级缓存 二级缓存的范围是SqlSessionFactory 使用二级缓存需要具备以下几个条件 setting namecacheEnabled valuetrue全局性地开启或关闭所有映射器配置文件中已配置地任何缓存默认就是true无需配置。在需要使用二级缓存的SqlMapper.xml文件中添加配置cache/使用二级缓存的实体类对象必须是可序化的也就是必须实现java.io.Serializable接口SqlSession对象关闭或提交之后一级缓存中的数据才会被写入到二级缓存当中。此时二级缓存才可用。 Test public void testSelectById2() throws Exception{// 这里只有一个SqlSessionFactory对象二级缓存对应的就是SqlSessionFactorySqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(mybatis-config.xml));SqlSession sqlSession1 sqlSessionFactory.openSession();SqlSession sqlSession2 sqlSessionFactory.openSession();CarMapper mapper1 sqlSession1.getMapper(CarMapper.class);CarMapper mapper2 sqlSession1.getMapper(CarMapper.class);//这行代码执行结束之后实际上数据是缓存到一级缓存当中了。(sqlSession1是一级缓存。)Car car1 mapper1.selectById(10086L);System.out.println(car1);//如果这里不关闭SqlSession1对象的话二级缓存中还是没有数据的。//这行代码执行结束之后实际上数据是缓存到一级缓存当中了。(sqlSession2是一级缓存。)Car car2 mapper2.selectById(10086L);System.out.println(car2);//程序执行到这里的时候会将sqlSession1这个一级缓存中的数据写入到二级缓存当中sqlSession1.close();//程序执行到这里的时候会将sqlSession2这个一级缓存中的数据写入到二级缓存当中sqlSession1.close(); }如果将sqlSession1的close放到car2定义的前面
二级缓存失效 只要两次查询之间出现了增删改操作。二级缓存就会失效。一级缓存也会失效 二级缓存相关配置 eviction驱逐指定从缓存中溢出某个对象的淘汰算法。默认采用LRU策略。 a. LRULeast Recently Used。最近最少使用。优先淘汰再建个时间内使用频率最低的对象。其实还有一种淘汰算法LFU最不常用 b. FIFOFirst In First Out。一种先进先出的数据缓存器。先进入二级缓存的对象最先被淘汰 c. SOFT软引用。淘汰软引用指向的对象。具体算法和JVM的垃圾回收算法有关。 d. WEAK弱引用。淘汰引用指向的对象。具体的算法和JVM的垃圾回收算法有关。flushInterval a. 二级缓存的刷新时间间隔。单位毫秒。如果没有设置就代表不刷新缓存只要内存足够大一直会向二级缓存中缓存数据。除非执行了增删改。readOnly a. true多条相同的sql语句执行之后返回的对象是共享的同一个。性能好但是多线程并发可能会存在安全问题。 b. false多条相同的sql语句之后返回的对象是副本调用了close方法性能一般但安全。size a. 设置二级缓存中最多可存储的java数量默认值1024 MyBatis集成EhCache 集成EhCache是为了代替mybatis自带的二级缓存。一级缓存是无法替代的。 mybatis对外提供了接口也可以集成第三方的缓存组件。比如EhCache、Memcache等都可以。 EhCache是Java写的。Memcache是C语言写的。所以mybatis集成EhCache比较常见 下面是如何配置 第一步引入mybatis整合ehcache的依赖 !– pom.xml –dependencygroupIdorg.mybatis.caches/groupIdartifactIdmybatis-ehcache/artifactIdversion1.2.2/version/dependency第二步在类的根路径下新建ehcache.xml文件并提供以下配置信息 ?xml version1.0 encodingUTF-8 ? ehcache xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:noNamespaceSchemaLocationhttp://ehcache.org/ehcache.xsdupdateCheckfalse !– 磁盘存储将缓存中暂时不适用的对象转移到硬盘类似于Windows系统的虚拟内存–diskStore path/!–defaultCache默认的管理策略–!–eternal设定缓存的elements是否永远不过期。如果为true则缓存的数据始终有效如果为false那么还要根据timeToIdleSecondstimeToLiveSeconds判断–!–maxElementsInMemory在内存中缓存的element的最大数目–!–overflowToDisk如果内存中数据超过内存限制是否缓存到磁盘上–!–diskPersistent是否在磁盘上持久化指重启JVM后数据是否有效默认为false–!–timeToIdleSeconds对象空闲时间单位秒指对象在多长时间没有被访问就会失效。只对eternal为false的有效默认值为0表示一直可以访问–!–timeToLiveSeconds对象存活时间单位秒指对象从创建到失败所需要的时间。只对eternal为false的有效。默认值为0表示一直可以访问–!–memoryStoreEvictionPolicy缓存的三种清空策略–!–FIFOfirst in first out先进先出–!–LFULess Frequently Used最少使用意思是一直以来最少被使用的。缓存的元素有一个hit属性hit值最小的将会被清出缓存–!–LRULeast Recently Used最近最少使用。ehcache默认值缓存的元素有一个时间戳当缓存容量满了而又需要腾出地方来缓存新的元素的时候那么现有的缓存元素中时间戳离当前时间最远的元素将被驱逐–defaultCache eternalfalse maxElementsInMemory1000 overflowToDiskfalse diskPersistentfalsetimeToIdleSeconds0 timeToLiveSeconds600 memoryStoreEvictionPolicyLRU//ehcache第三步修改SqlMapper.xml文件中的cache/标签添加type属性。 cache typeorg.mybatis.caches.ehcache.EhcacheCache/然后就能运行了