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

网站右边跳出的广告怎么做17网一起做网店普宁站

网站右边跳出的广告怎么做,17网一起做网店普宁站,注册一个咨询公司需要多少钱,开厂做哪个网站比较好本系列文章将分篇展开《EKP 性能开发最佳实践》中的重要技术点,帮助开发者快速了解和实施EKP性能优化方案。本章讲 Hibernate懒加载检测与开发助手。 在使用 Hibernate 管理对象时,默认的懒加载(lazy loading)行为虽然提高了初始…

本系列文章将分篇展开《EKP 性能开发最佳实践》中的重要技术点,帮助开发者快速了解和实施EKP性能优化方案。本章讲  Hibernate懒加载检测与开发助手。

在使用 Hibernate 管理对象时,默认的懒加载(lazy loading)行为虽然提高了初始化性能,但在实际开发中却容易引发 N+1 查询、空指针异常等问题。为此,EKP 提供了 HibernateUtil 工具类,辅助判断和调试集合或属性是否已经初始化,从而让懒加载的控制更加清晰。

一、问题产生的原因

当使用 Hibernate 的懒加载(Lazy Loading)机制时,如果在主查询中获取了多个实体,而每个实体又关联其他实体,当访问这些关联实体时,Hibernate 会触发额外的 SQL 查询。例如:

// 主查询:获取所有订单
List<Order> orders = session.createQuery("FROM Order", Order.class).list();// 遍历订单并访问每个订单的用户(触发 N 次查询)
for (Order order : orders) {User user = order.getUser(); // 每次访问都会触发一次 SQL 查询System.out.println("Order: " + order.getId() + ", User: " + user.getName());
}

这里主查询获取了 N 个订单,然后在遍历订单时,每个订单的用户信息都需要单独查询,导致总共执行了 1+N 次查询。

二、关键方法说明

1. 判断集合是否已加载
    public static boolean wasInitialed(Collection collection){boolean wasInitialed = false;if(collection instanceof AbstractPersistentCollection){wasInitialed = AbstractPersistentCollection.class.cast(collection).wasInitialized();}else{wasInitialed = true;}return wasInitialed;}

2. 判断集合是否已加载使用场景

​
// 先判断是否已经加载过,如果传入的参数已经是加载过的,那就直接用(既原来的checkUserModels)
// 否则采用绕过的hibernate的方式处理
if(HibernateUtil.wasInitialed(elements)){return checkUserModels(elements);
}//下面逻辑是采取绕过去方式判断逻辑
boolean hasData = authField.hasData(modelId, modelName);
if(!hasData){return false;
}
boolean contains = false;
// 内部人员在判断权限时,加上everyone
List orgIds = getKMSSUser().getUserAuthInfo().getAuthOrgIds();
if (!BooleanUtils.isTrue(getKMSSUser().getFdIsExternal())) {orgIds.add(SysOrgConstant.ORG_PERSON_EVERYONE_ID);
}
contains = authField.contains(modelId, modelName, orgIds);//涉及elements的循环,如果集合已经加载过,这里就不会触发N+1操作。
public static boolean checkUserModels(List<?> elements) {if (CollectionUtils.isEmpty(elements)) {return false;}List<String> ids = new ArrayList<String>();for (int i = 0; i < elements.size(); i++) {ids.add(((ISysOrgElement) elements.get(i)).getFdId());}// 内部人员在判断权限时,加上everyoneList orgIds = getKMSSUser().getUserAuthInfo().getAuthOrgIds();if (!BooleanUtils.isTrue(getKMSSUser().getFdIsExternal())) {orgIds.add(SysOrgConstant.ORG_PERSON_EVERYONE_ID);}return ArrayUtil.isListIntersect(ids, orgIds);
}​
4. 判断对象属性是否已加载
    /*** 判断model的某个属性是否被加载* @param model* @param propertyName* @return*/public static boolean isPropertyInitialed(Object model,String propertyName){return Hibernate.isPropertyInitialized(model,propertyName);}

5. 判断对象属性是否已加载

用于检测某个对象的具体属性是否已加载:
if (HibernateUtil.isPropertyInitialed(model, "docCreator")) {// docCreator 已加载直接使用docCreator的逻辑,不会产生查询
}// docCreator 未加载,使用绕过去逻辑,否则每次去拿docCreator,都会产生一次查询。

三、SQL调试工具

1. 输出SQL并打印栈信息

runSqlWithDebugger(sql, "日志信息", ps -> ps.executeQuery(), preparedStatement);

可用于包裹原生SQL执行过程,在 Hibernate 设置为 debug 时自动输出 SQL 和调用堆栈,便于排查性能瓶颈。

2. 输出完整SQL执行信息

showSqlAndStack(statement, cost, desc);

可手动输出当前 SQL 的执行耗时及调用来源。

四、实际应用场景

  • 调试N+1问题:通过判断属性是否初始化来避免在循环中无意触发多次数据库查询。
  • 性能诊断:借助 SQL 调试器快速定位慢查询及其调用堆栈。
  • 防御性编码:避免未初始化对象引起的 LazyInitializationException。

通过以上方法,开发者可以更灵活、清晰地控制和调试 Hibernate 的懒加载行为,进一步减少隐藏的性能问题。

http://www.dtcms.com/a/526080.html

相关文章:

  • Vite 工作原理
  • 在vue-next-admin开源项目增加定义布局配置:页面缓存接口数据
  • 网站建设教学视频百度云盘wordpress 标签云 插件
  • 网站产品使用说明书怎么做wordpress站外连接
  • 网站资料如何做参考文献时尚网站模板
  • 欧美在线网站设计教程企业所得税税率2022
  • 【零基础学MySQL】第一章:MySQL介绍与安装
  • 邯郸有学做搭建网站的吗为客户创建网站必须
  • 网站加入wordpress免费网站app下载汅api
  • ftp链接网站空间苏州营销型网站开发公司
  • 2025妈妈杯大数据竞赛A题mathorcup大数据:集装箱智能破损检测问题手把手思路代码文章教学大学生数学建模
  • 网站备案资料申请平面设计与广告设计
  • 企业类网站模板免费下载dedecms网站乱码
  • 爱思唯尔期刊投稿经验
  • 山东城市建设职业学院图书馆网站抖音怎么推广
  • Hive 加载文件数据到表
  • C++中函数重载解析:从原理到应用
  • Toolhub — 一个干净实用的在线工具集合
  • 深圳网站优化运营安卓手机网页视频怎么下载
  • 做网站自动赚钱珠海网站建设策略
  • 制作公司网站结构图汽车网站模板下载
  • 南通网站建设报价成都装修网
  • 网站模板平台资源搜索引擎seo关键词优化
  • 优秀网站案例欣赏明会红网站
  • 优秀企业网站案例附近学电脑培训班
  • 不知此网站枉做男人的网站微网站 报价
  • 蔬菜网站模板城乡与建设厅网站首页
  • 【c++】this指针学习与理解
  • 【若依】若依框架中实现国际化多语言切换的步骤
  • 重庆城乡建设子网站一个完整的工程项目流程