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

大型网站开发团队免费网站素材下载

大型网站开发团队,免费网站素材下载,iis6建设网站,江门网站建设设计文章目录 什么是延迟加载#xff1f;实现局部延迟加载全局延迟加载 延迟加载原理实现延迟加载原理#xff08;源码剖析)Setting 配置加载#xff1a;延迟加载代理对象创建注意事项 什么是延迟加载#xff1f; 在开发过程中很多时候我们并不需要总是在加载⽤户信息时就⼀定… 文章目录 什么是延迟加载实现局部延迟加载全局延迟加载 延迟加载原理实现延迟加载原理源码剖析)Setting 配置加载延迟加载代理对象创建注意事项 什么是延迟加载 在开发过程中很多时候我们并不需要总是在加载⽤户信息时就⼀定要加载他的订单信息。此时就是我 们所说的延迟加载。 举个栗⼦ 在⼀对多中当我们有⼀个⽤户它有个100个订单 在查询⽤户的时候要不要把关联的订单查出来 在查询订单的时候要不要把关联的⽤户查出来 回答 在查询⽤户时⽤户下的订单应该是什么时候⽤什么时候查询。 在查询订单时订单所属的⽤户信息应该是随着订单⼀起查询出来。 延迟加载 就是在需要⽤到数据时才进⾏加载不需要⽤到数据时就不加载数据。延迟加载也称懒加载。 优点 先从单表查询需要时再从关联表去关联查询⼤⼤提⾼数据库性能因为查询单表要⽐关联查询多张表速度要快。 缺点 因为只有当需要⽤到数据时才会进⾏数据库查询这样在⼤批量数据查询时因为查询⼯作也要消耗时间所以可能造成⽤户等待时间变⻓造成⽤户体验下降。 在多表中 ⼀对多多对多通常情况下采⽤延迟加载 ⼀对⼀多对⼀通常情况下采⽤⽴即加载 注意 延迟加载是基于嵌套查询来实现的。 实现 局部延迟加载 在association和collection标签中都有⼀个fetchType属性通过修改它的值可以修改局部的加载策略。 !-- 开启⼀对多 延迟加载 -- resultMap iduserMap typeuserid columnid propertyid/idresult columnusername propertyusername/resultresult columnpassword propertypassword/resultresult columnbirthday propertybirthday/result!--fetchTypelazy 懒加载策略fetchTypeeager ⽴即加载策略--collection propertyorderList ofTypeorder columnid selectcom.zjq.dao.OrderMapper.findByUid fetchTypelazy/collection /resultMap select idfindAll resultMapuserMapSELECT * FROM user /select全局延迟加载 在Mybatis的核⼼配置⽂件中可以使⽤setting标签修改全局的加载策略。 注意 !-- 关闭⼀对⼀ 延迟加载 -- resultMap idorderMap typeorderid columnid propertyid/idresult columnordertime propertyordertime/resultresult columntotal propertytotal/result!--fetchTypelazy 懒加载策略fetchTypeeager ⽴即加载策略--association propertyuser columnuid javaTypeuserselectcom.zjq.dao.UserMapper.findById fetchTypeeager/association /resultMap select idfindAll resultMaporderMapSELECT * from orders /select延迟加载原理实现 它的原理是使⽤ CGLIB 或 Javassist( 默认 ) 创建⽬标对象的代理对象。当调⽤代理对象的延迟加载属性的 getting ⽅法时进⼊拦截器⽅法。⽐如调⽤ a.getB().getName() ⽅法进⼊拦截器的invoke(…) ⽅法发现 a.getB() 需要延迟加载时那么就会单独发送事先保存好的查询关联 B对象的 SQL 把 B 查询上来然后调⽤a.setB(b) ⽅法于是 a 对象 b 属性就有值了接着完成a.getB().getName() ⽅法的调⽤。这就是延迟加载的基本原理 总结延迟加载主要是通过动态代理的形式实现通过代理拦截到指定⽅法执⾏数据加载。 延迟加载原理源码剖析) MyBatis延迟加载主要使⽤JavassistCglib实现类图展示 Setting 配置加载 public class Configuration {/** aggressiveLazyLoading* 当开启时任何⽅法的调⽤都会加载该对象的所有属性。否则每个属性会按需加载参考lazyLoadTriggerMethods).* 默认为true* */protected boolean aggressiveLazyLoading;/*** 延迟加载触发⽅法*/protected SetString lazyLoadTriggerMethods new HashSetString(Arrays.asList(new String[] { equals, clone, hashCode, toString }));/** 是否开启延迟加载 */protected boolean lazyLoadingEnabled false;/*** 默认使⽤Javassist代理⼯⼚* param proxyFactory*/public void setProxyFactory(ProxyFactory proxyFactory) {if (proxyFactory null) {proxyFactory new JavassistProxyFactory();}this.proxyFactory proxyFactory;}//省略... }延迟加载代理对象创建 Mybatis的查询结果是由ResultSetHandler接⼝的handleResultSets()⽅法处理的。ResultSetHandler接⼝只有⼀个实现DefaultResultSetHandler接下来看下延迟加载相关的⼀个核⼼的⽅法。 //创建结果对象 private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {this.useConstructorMappings false; // reset previous mapping resultfinal ListClass? constructorArgTypes new ArrayListClass?();final ListObject constructorArgs new ArrayListObject();//创建返回的结果映射的真实对象Object resultObject createResultObject(rsw, resultMap, constructorArgTypes, constructorArgs, columnPrefix);if (resultObject ! null !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {final ListResultMapping propertyMappings resultMap.getPropertyResultMappings();for (ResultMapping propertyMapping : propertyMappings) {// issue gcode #109 issue #149// 判断属性有没配置嵌套查询如果有就创建代理对象if (propertyMapping.getNestedQueryId() ! null propertyMapping.isLazy()) {//创建延迟加载代理对象resultObject configuration.getProxyFactory().createProxy(resultObject, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);break;}}}this.useConstructorMappings resultObject ! null !constructorArgTypes.isEmpty(); // set current mapping resultreturn resultObject;}默认采⽤javassistProxy进⾏代理对象的创建。 public class Configuration {protected ProxyFactory proxyFactory new JavassistProxyFactory(); }JavasisstProxyFactory实现 public class JavassistProxyFactory implements org.apache.ibatis.executor.loader.ProxyFactory {/*** 接⼝实现* param target ⽬标结果对象* param lazyLoader 延迟加载对象* param configuration 配置* param objectFactory 对象⼯⼚* param constructorArgTypes 构造参数类型* param constructorArgs 构造参数值* return*/Overridepublic Object createProxy(Object target, ResultLoaderMap lazyLoader, Configuration configuration, ObjectFactory objectFactory, ListClass? constructorArgTypes, ListObject constructorArgs) {return EnhancedResultObjectProxyImpl.createProxy(target, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);}/*** 创建代理对象* param type* param callback* param constructorArgTypes* param constructorArgs* return*/ static Object crateProxy(Class? type, MethodHandler callback, ListClass? constructorArgTypes, ListObject constructorArgs) {ProxyFactory enhancer new ProxyFactory();enhancer.setSuperclass(type);try {//通过获取对象⽅法判断是否存在该⽅法type.getDeclaredMethod(WRITE_REPLACE_METHOD);// ObjectOutputStream will call writeReplace of objects returned by writeReplaceif (log.isDebugEnabled()) {log.debug(WRITE_REPLACE_METHOD method was found on bean type , make sure it returns this);}//没找到该⽅法实现接⼝} catch (NoSuchMethodException e) {enhancer.setInterfaces(new Class[]{WriteReplaceInterface.class});} catch (SecurityException e) {// nothing to do here}Object enhanced;Class?[] typesArray constructorArgTypes.toArray(new Class[constructorArgTypes.size()]);Object[] valuesArray constructorArgs.toArray(new Object[constructorArgs.size()]);try {//创建新的代理对象enhanced enhancer.create(typesArray, valuesArray);} catch (Exception e) {throw new ExecutorException(Error creating lazy proxy. Cause: e, e);}//设置代理执⾏器((Proxy) enhanced).setHandler(callback);return enhanced;}/*** 内部类代理对象实现核⼼逻辑执⾏*/private static class EnhancedResultObjectProxyImpl implements MethodHandler {private final Class? type;private final ResultLoaderMap lazyLoader;private final boolean aggressive;private final SetString lazyLoadTriggerMethods;private final ObjectFactory objectFactory;private final ListClass? constructorArgTypes;private final ListObject constructorArgs;private EnhancedResultObjectProxyImpl(Class? type, ResultLoaderMap lazyLoader, Configuration configuration, ObjectFactory objectFactory, ListClass? constructorArgTypes, ListObject constructorArgs) {this.type type;this.lazyLoader lazyLoader;this.aggressive configuration.isAggressiveLazyLoading();this.lazyLoadTriggerMethods configuration.getLazyLoadTriggerMethods();this.objectFactory objectFactory;this.constructorArgTypes constructorArgTypes;this.constructorArgs constructorArgs;}public static Object createProxy(Object target, ResultLoaderMap lazyLoader, Configuration configuration, ObjectFactory objectFactory, ListClass? constructorArgTypes, ListObject constructorArgs) {final Class? type target.getClass();EnhancedResultObjectProxyImpl callback new EnhancedResultObjectProxyImpl(type, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);//调用外部类的方法Object enhanced crateProxy(type, callback, constructorArgTypes, constructorArgs);PropertyCopier.copyBeanProperties(type, target, enhanced);return enhanced;}/*** 代理对象执⾏* param enhanced 原对象* param method 原对象⽅法* param methodProxy 代理⽅法* param args ⽅法参数* return* throws Throwable*/Overridepublic Object invoke(Object enhanced, Method method, Method methodProxy, Object[] args) throws Throwable {final String methodName method.getName();try {synchronized (lazyLoader) {if (WRITE_REPLACE_METHOD.equals(methodName)) {Object original;//忽略暂未找到具体作⽤if (constructorArgTypes.isEmpty()) {original objectFactory.create(type);} else {original objectFactory.create(type, constructorArgTypes, constructorArgs);}PropertyCopier.copyBeanProperties(type, enhanced, original);if (lazyLoader.size() 0) {return new JavassistSerialStateHolder(original, lazyLoader.getProperties(), objectFactory, constructorArgTypes, constructorArgs);} else {return original;}} else {//延迟加载数量⼤于0if (lazyLoader.size() 0 !FINALIZE_METHOD.equals(methodName)) {//aggressive ⼀次加载性所有需要要延迟加载属性或者包含触发延迟加载⽅法if (aggressive || lazyLoadTriggerMethods.contains(methodName)) {//⼀次全部加载lazyLoader.loadAll();} else if (PropertyNamer.isSetter(methodName)) {//判断是否为set⽅法set⽅法不需要延迟加载final String property PropertyNamer.methodToProperty(methodName);lazyLoader.remove(property);} else if (PropertyNamer.isGetter(methodName)) {final String property PropertyNamer.methodToProperty(methodName);if (lazyLoader.hasLoader(property)) {//延迟加载单个属性lazyLoader.load(property);}}}}}return methodProxy.invoke(enhanced, args);} catch (Throwable t) {throw ExceptionUtil.unwrapThrowable(t);}}} }注意事项 IDEA调试问题 当配置aggressiveLazyLoadingtrue在使⽤IDEA进⾏调试的时候如果断点打到代理执⾏逻辑当中你会发现延迟加载的代码永远都不能进⼊总是会被提前执⾏。 主要产⽣的原因在aggressiveLazyLoading因为在调试的时候IDEA的Debuger窗体中已经触发了延迟加载对象的⽅法。 本文内容到此结束了 如有收获欢迎点赞收藏关注✔️您的鼓励是我最大的动力。 如有错误❌疑问欢迎各位指出。 主页共饮一杯无的博客汇总‍ 保持热爱奔赴下一场山海。
http://www.huolong8.cn/news/167960/

相关文章:

  • 上海专业的网站云南旅游
  • 深圳住房和建设局网站办事跟踪wordpress miwoftp
  • 镇江高端网站建设嵩明建设局网站
  • 宿迁做网站需要多少钱网站维护排名
  • 雅安工程交易建设网站不花钱自己可以做网站吗
  • 北航做网站公司宜昌市网站建设公司
  • 招商网站大全免费优化排名工具
  • 平面设计网站免费大推荐查征信怎么查 个人免费查询
  • 网站推广方案的构成一般做网站哪家好
  • 超市网站建设费用易企营销型网站建设企业
  • 网站开发与运营怎么样学校网站模板免费下载
  • 昆明网页建站模板凌峰wordpress百度云
  • 网站建设教程网哪个好gta5购买房产网站正在建设
  • wordpress福利整站源码网站一般建什么
  • asp.net网站开发与应用wordpress站点浏览
  • wordpress多语言企业网站手机怎么做动漫微电影网站
  • 顺企网宁波网站建设五分钟wordpress
  • 品牌网站建设必在大蝌蚪中企动力企业邮箱入口
  • 深圳网站设计哪家公司好wordpress标记已读
  • 怎么给别人做网站网站设计找版面网站
  • 慈溪企业网站建设公司领卷网站怎么做
  • 网站建设与O2O的应用清智优化北京
  • 网站规划模板关键词挖掘站网
  • 网站开发相关优惠条件phpcms 关闭网站
  • 怎样做网站反链高端定制网站的特点
  • 公司做网站怎么构思广州新塘做网站
  • 儿童教育 php模板 网站网站建设员工技能要求
  • 成都最专业做网站的如何网站切换
  • 网站建设合同制人员招聘永州市住房和城乡建设厅网站
  • 网站建设管理和维护家具网站开发设计任务书与执行方案