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

山东城市建设招生网站wordpress禁用google字体

山东城市建设招生网站,wordpress禁用google字体,设计网站会员,微信软件定制开发mybaits提供一级缓存#xff0c;和二级缓存 一级缓存#xff08;默认开启#xff09; 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象#xff0c;在对象中有一个(内存区域)数据结构#xff08;HashMap#xff09;用于存储缓存数据。不同的sqlSe…mybaits提供一级缓存和二级缓存 一级缓存默认开启 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象在对象中有一个(内存区域)数据结构HashMap用于存储缓存数据。不同的sqlSession之间的缓存数据区域HashMap是互相不影响的。 一级缓存的作用域是同一个SqlSession在同一个sqlSession中两次执行相同的sql语句第一次执行完毕会将数据库中查询的数据写到缓存内存第二次会从缓存中获取数据将不再从数据库查询从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。 一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下我们使用同一个SqlSession对象调用一个Mapper方法往往只执行一次SQL因为使用SelSession第一次查询后MyBatis会将其放在缓存中以后再查询的时候如果没有声明需要刷新并且缓存没有超时的情况下SqlSession都会取出当前缓存的数据而不会再次发送SQL到数据库。 一级缓存的生命周期有多长   a、MyBatis在开启一个数据库会话时会 创建一个新的SqlSession对象SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象当会话结束时SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。   b、如果SqlSession调用了close()方法会释放掉一级缓存PerpetualCache对象一级缓存将不可用。   c、如果SqlSession调用了clearCache()会清空PerpetualCache对象中的数据但是该对象仍可使用。   d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) 都会清空PerpetualCache对象的数据但是该对象可以继续使用 怎么判断某两次查询是完全相同的查询   mybatis认为对于两次查询如果以下条件都完全一样那么就认为它们是完全相同的两次查询。   2.1 传入的statementId   2.2 查询时要求的结果集中的结果范围   2.3. 这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串boundSql.getSql()   2.4 传递给java.sql.Statement要设置的参数值 Testpublic void testCache1() throws Exception{SqlSessionsqlSession sqlSessionFactory.openSession();//创建代理对象UserMapperuserMapper sqlSession.getMapper(UserMapper.class);//下边查询使用一个SqlSession//第一次发起请求查询id为1的用户Useruser1 userMapper.findUserById(1);System.out.println(user1);// 如果sqlSession去执行commit操作执行插入、更新、删除清空SqlSession中的一级缓存这样做的目的为了让缓存中存储的是最新的信息避免脏读。//更新user1的信息user1.setUsername(测试用户22);userMapper.updateUser(user1);//执行commit操作去清空缓存sqlSession.commit();//第二次发起请求查询id为1的用户Useruser2 userMapper.findUserById(1);System.out.println(user2);sqlSession.close();} mybatis和spring进行整合开发事务控制在service中。 一个service方法中包括很多mapper方法调用。 如果是执行两次service调用查询相同的用户信息不走一级缓存因为Service方法结束sqlSession就关闭一级缓存就清空。 service{//开始执行时开启事务创建SqlSession对象//第一次调用mapper的方法findUserById(1)//第二次调用mapper的方法findUserById(1)从一级缓存中取数据//aop控制 只要方法结束sqlSession关闭 sqlsession关闭后就销毁数据结构清空缓存Service结束sqlsession关闭} 二级缓存 MyBatis的二级缓存是Application级别的缓存 二级缓存是mapper级别的缓存多个SqlSession去操作同一个Mapper的sql语句多个SqlSession去操作数据库得到数据会存在二级缓存区域多个SqlSession可以共用二级缓存二级缓存是跨SqlSession的。 二级缓存是多个SqlSession共享的其作用域是mapper的同一个namespace不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句第一次执行完毕会将数据库中查询的数据写到缓存内存第二次会从缓存中获取数据将不再从数据库查询从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。 二级缓存与一级缓存区别二级缓存的范围更大多个sqlSession可以共享一个UserMapper的二级缓存区域。数据类型仍然为HashMap UserMapper有一个二级缓存区域按namespace分如果namespace相同则使用同一个相同的二级缓存区其它mapper也有自己的二级缓存区域按namespace分。 每一个namespace的mapper都有一个二缓存区域两个mapper的namespace如果相同这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。 sqlSessionFactory层面上的二级缓存默认是不开启的二级缓存的开启需要进行配置实现二级缓存的时候MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口配置方法很简单只需要在映射XML文件配置就可以开启缓存了cache/如果我们配置了二级缓存就意味着 映射语句文件中的所有select语句将会被缓存。 映射语句文件中的所欲insert、update和delete语句会刷新缓存。 缓存会使用默认的Least Recently UsedLRU最近最少使用的算法来收回。 根据时间表比如No Flush Interval,CNFI没有刷新间隔缓存不会以任何时间顺序来刷新。 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用 缓存会被视为是read/write(可读/可写)的缓存意味着对象检索不是共享的而且可以安全的被调用者修改不干扰其他调用者或线程所做的潜在修改。 开启二级缓存 mybaits的二级缓存是mapper范围级别除了在SqlMapConfig.xml设置二级缓存的总开关还要在具体的mapper.xml中开启二级缓存。 在核心配置文件SqlMapConfig.xml中加入 setting namecacheEnabledvaluetrue/!-- 全局配置参数需要时再设置 --settings!-- 开启二级缓存 默认值为true --setting namecacheEnabled valuetrue//settings 在UserMapper.xml中开启二缓存UserMapper.xml下的sql执行完成会存储到它的缓存区域HashMap mapper namespacecn.hpu.mybatis.mapper.UserMapper!-- 开启本mapper namespace下的二级缓存 --cache/cache 调用pojo类实现序列化接口 public class Userimplements Serializable {//Serializable实现序列化为了将来反序列化 二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作注意如果存在父类、成员pojo都需要实现序列化接口。 pojo类实现序列化接口是为了将缓存数据取出执行反序列化操作因为二级缓存数据存储介质多种多样不一定在内存有可能是硬盘或者远程服务器。   // 二级缓存测试Testpublic void testCache2() throws Exception {SqlSessionsqlSession1 sqlSessionFactory.openSession();SqlSessionsqlSession2 sqlSessionFactory.openSession();SqlSessionsqlSession3 sqlSessionFactory.openSession();// 创建代理对象UserMapperuserMapper1 sqlSession1.getMapper(UserMapper.class);// 第一次发起请求查询id为1的用户Useruser1 userMapper1.findUserById(1);System.out.println(user1);//这里执行关闭操作将sqlsession中的数据写到二级缓存区域sqlSession1.close();//使用sqlSession3执行commit()操作UserMapperuserMapper3 sqlSession3.getMapper(UserMapper.class);Useruser userMapper3.findUserById(1);user.setUsername(张明明);userMapper3.updateUser(user);//执行提交清空UserMapper下边的二级缓存sqlSession3.commit();sqlSession3.close();UserMapperuserMapper2 sqlSession2.getMapper(UserMapper.class);// 第二次发起请求查询id为1的用户Useruser2 userMapper2.findUserById(1);System.out.println(user2);sqlSession2.close();} useCache配置禁用二级缓存 在statement中设置useCachefalse可以禁用当前select语句的二级缓存即每次查询都会发出sql去查询默认情况是true即该sql使用二级缓存。 selectidfindOrderListResultMap resultMapordersUserMap useCachefalse 总结针对每次查询都需要最新的数据sql要设置成useCachefalse禁用二级缓存。 mybatis刷新缓存就是清空缓存 在mapper的同一个namespace中如果有其它insert、update、delete操作数据后需要刷新缓存如果不执行刷新缓存会出现脏读。  设置statement配置中的flushCachetrue 属性默认情况下为true即刷新缓存如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。 如下 insertidinsertUser parameterTypecn.itcast.mybatis.po.User flushCachetrue   总结一般下执行完commit操作都需要刷新缓存flushCachetrue表示刷新缓存默认情况下为true,我们不用去设置它这样可以避免数据库脏读。 Mybatis Cache参数 flushInterval刷新间隔可以被设置为任意的正整数而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置也就是没有刷新间隔缓存仅仅调用语句时刷新。 size引用数目可以被设置为任意正整数要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。 readOnly只读属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝通过序列化。这会慢一些但是安全因此默认是false。 如下例子 cache  evictionFIFO flushInterval60000  size512 readOnlytrue/ 这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有, 默认的是 LRU: 1.      LRU – 最近最少使用的:移除最长时间不被使用的对象。 2.      FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 3.      SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。 4.      WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。 mybatis整合ehcache ehcache是一个分布式缓存框架。 EhCache 是一个纯Java的进程内缓存框架是一种广泛使用的开源Java分布式缓存具有快速、精干等特点是Hibernate中默认的CacheProvider。 不使用分布缓存缓存的数据在各各服务单独存储不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。 mybatis无法实现分布式缓存需要和其它分布式缓存框架进行整合。 整合方法(掌握无论整合谁首先想到改type接口) mybatis提供了一个cache接口如果要实现自己的缓存逻辑实现cache接口开发即可。 mybatis和ehcache整合mybatis和ehcache整合包中提供了一个cache接口的实现类。 加入ehcache包 整合ehcache 配置mapper中cache中的type为ehcache对cache接口的实现类型。 mapper namespacecn.hpu.mybatis.mapper.UserMapper!-- 开启本mapper namespace下的二级缓存type指定cache接口实现类mybatis默认使用PerpetualCache要和eache整合需要配置type为ehcahe实现cache接口的类型--cache typeorg.mybatis.caches.ehcache.EhcacheCache/cache 可以根据需求调整缓存参数 cache typeorg.mybatis.caches.ehcache.EhcacheCacheproperty nametimeToIdleSeconds value3600/property nametimeToLiveSeconds value3600/!-- 同ehcache参数maxElementsInMemory--property namemaxEntriesLocalHeapvalue1000/!-- 同ehcache参数maxElementsOnDisk --property namemaxEntriesLocalDisk value10000000/property namememoryStoreEvictionPolicy valueLRU//cache 加入ehcache的配置文件 在classpath下配置ehcache.xml ehcache xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:noNamespaceSchemaLocation../config/ehcache.xsddiskStore pathF:\develop\ehcache/defaultCachemaxElementsInMemory1000maxElementsOnDisk10000000eternalfalseoverflowToDiskfalsetimeToIdleSeconds120timeToLiveSeconds120diskExpiryThreadIntervalSeconds120memoryStoreEvictionPolicyLRU/defaultCache/ehcache 属性说明  diskStore指定数据在磁盘中的存储位置。  defaultCache当借助CacheManager.add(demoCache)创建Cache时EhCache便会采用defalutCache/指定的的管理策略 以下属性是必须的 maxElementsInMemory - 在内存中缓存的element的最大数目 maxElementsOnDisk - 在磁盘上缓存的element的最大数目若是0表示无穷大  eternal - 设定缓存的elements是否永远不过期。如果为true则缓存的数据始终有效如果为false那么还要根据timeToIdleSecondstimeToLiveSeconds判断  overflowToDisk- 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上 以下属性是可选的 timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时这些数据便会删除默认值是0,也就是可闲置时间无穷大 timeToLiveSeconds - 缓存element的有效生命期默认是0.,也就是element存活时间无穷大        diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区. diskPersistent在VM重启的时候是否启用磁盘保存EhCache中的数据默认是false。 diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔默认是120秒。每个120s相应的线程会进行一次EhCache中数据的清理工作 memoryStoreEvictionPolicy - 当内存缓存达到最大有新的element加入的时候移除缓存中element的策略。默认是LRU最近最少使用可选的有LFU最不常使用和FIFO先进先出 集成SpringBoot缓存相关问题 1.一级缓存只有在开启了数据库事物【EnableTransactionManagement】并且处于一个被事物标注的方法下【直接或间接】才会生效。 2.禁用一级缓存mybatis没有提供一级缓存的启用、禁用开关但在Mapper文件对应的语句中增加flushCachetrue可以达到实际禁用一级缓存的效果一般同时还会加上useCachefalse以便关闭二级缓存下面讨论使用springboot配置的方式控制一级缓存。 MyBatis 一级缓存MyBaits 称其为 Local Cache无法关闭但是有两种级别可选 A.session 在同一个 sqlSession 内对同样的查询将不再查询数据库直接从缓存中获取。 mybatis:configuration:cache-enabled: false #禁用二级缓存local-cache-scope: session #一级缓存指定为session级别 B.statement 每次查询结束都会清掉一级缓存实际效果就是禁用了一级缓存 mybatis:configuration:cache-enabled: false #禁用二级缓存local-cache-scope: statement #一级缓存指定为statement级别 Transactional(propagation Propagation.REQUIRED) public ListUsers getUsers() {ListUsers usersList usersMapper.selectByExample(new UsersExample()); #1usersList usersMapper.selectByExample(new UsersExample()); #2return usersList; } A.一级缓存级别设置为session 在代码中1处通过日志观察打印出sql语句未走缓存【此时缓存数据还不存在】 在执行2处语句之前通过数据库工具修改数据库记录并提交继续执行程序后通过日志观察未打印出sql语句获取的数据未体现出通过工具修改数据的变化说明使用的是缓存中的数据 B.一级缓存级别设置为statement 在代码中1处通过日志观察打印出sql语句未走缓存【此时缓存数据还不存在】 在执行2处语句之前通过数据库工具修改数据库记录并提交继续执行程序后通过日志观察打印出sql语句且获取的数据也体现出通过工具修改数据的变化说明未使用缓存中的数据 结论通过将一级缓存级别设置为statement可以达到禁用一级缓存的效果。 Transactional(propagation Propagation.REQUIRED) public ListUsers getUsers() {ListUsers usersList usersMapper.selectByExample(new UsersExample()); #1usersList usersServer.getUsersList();return usersList; }  #下面的代码属于usersServer Transactional(propagation Propagation.NESTED) #3 public ListUsers getUsersList() {return usersMapper.selectByExample(new UsersExample()); #2 } 观察到的结果与上面的一致。 结论同上同时证明了嵌套事物NESTED本质上与上层事物处于一个相同的事物中。 将代码3处事物配置调整成REQUIRES_NEW重做之前的实验 观察到的结果在一级缓存级别为session与statement时现象一致带执行代码2处均打印SQL语句并且体现出了手动修改数据库记录的效果 结论REQUIRES_NEW确实重新起了一个新的事物与上层事物没有关系。 结论 1.将mybatis一级缓存级别设置为statement可以事实上达到禁用一级缓存的效果 2.启用mybatis一级缓存将级别设置为session【或不做任何设置mybaits默认就是这个级别】
http://www.yutouwan.com/news/167328/

相关文章:

  • 网站建设方案可行性广州品牌营销策划公司排名
  • 做商城网站如何寻找货源原创网站模版
  • 南宁市规划建设局 网站网站编写费用
  • diy电子商城网站北京最新消息今天新增病例
  • 产品经理网站开发需求合成版本传奇手游
  • 企业公众号以及网站建设学院网站建设成果
  • 搭建网站是什么工作Wordpress调用一组文章
  • app网站多少钱农村做网站开发
  • 建设银行车主卡网上交罚款网站澎湃动力网站建设公司
  • 网站建设好评公司全国建设项目竣工验收公示网站
  • 八宿县网站seo优化排名下载软件应用
  • 太原市住房和城乡建设局的网站首页中国互联网协会调解中心
  • 建设网站需要准备哪些内容百度风云榜游戏
  • 做ic芯片的要去哪个网站做网站用需要几个软件
  • 哪里有做空包网站的峰峰网站建设
  • 大型网站建设托管服务建设公司哪家好
  • 网站建设要域名和什么网站策划书预期风险
  • 网站开发的平台网站建设费的会计分录
  • 东莞网站建设(信科分公司)wordpress主题首页显示不全
  • 网站建设法律可行性网页链接中的文件路径分为
  • 在小说网站做责编创建wordpress主题
  • sqlite3做网站数据库东莞网站建设团队全网天下
  • 网页新建站点食品电子商务网站建设规划书
  • 江苏连云港网站设计公司cordova wordpress
  • 功能型类的网站品牌建设ppt
  • 大连响应式网站建设网站建设先进
  • 湖北省建设工程信息网seo薪资
  • html5 网站 优势怎么做网页设计原型
  • 网站链接建设及引流营销简单网页制作视频教程
  • 公司注册网上核名网站华美天一建筑公司网站