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

Windchill性能优化篇之分页查询

文章目录

      • Windchill性能优化篇之分页查询
        • 前言
        • 一、分页查询
        • 二、PageableQuerySpec和BasicPageableQuerySpec
        • 三、案例
        • 四、案例截图
        • 注意事项:

Windchill性能优化篇之分页查询

前言

面对超大数据的情况下,正常的高级查询很容易导致内存溢出(QuerySpec直接查询超过100万数据基本会导致JVM不响应),解决措施一般分为两种,第一种是设置查询数量,也是本章案例所使用的措施。第二种通过减少子类的查询,通过qs.setDescendantQuery(false),这里不过多介绍。

一、分页查询
  1. 介绍:

    分页查询是解决大数据场景的常用手段,不同于传统的java web项目,Windchill基于高级查询封装了一套 PagingQuery API,目前在WinDU和某些Picker均有使用。其中需要指定偏移量和步长,偏移量指的是从哪一条记录开始抓取数据,步长指的是每一页要显示多少数据,不清楚这个基本概念的可以看我javaweb专栏中的“分页的实现”这篇文章有一个基本的案例。

在此之前我们需要先简单了解一下PageableQuerySpecBasicPageableQuerySpec

二、PageableQuerySpec和BasicPageableQuerySpec
  1. 类的定义和用途

    • PageableQuerySpec
      • 这是一个接口或抽象类,通常定义了一组用于分页查询的基本功能和方法。它通常用于创建查询规范,支持分页功能,如设置偏移量和范围等。
      • 由于是接口或抽象类,具体的实现会由其他类(如 BasicPageableQuerySpec)来完成。
    • BasicPageableQuerySpec
      • 这是 PageableQuerySpec 的具体实现类,提供了分页查询的实际功能。它实现了 PageableQuerySpec 定义的接口,包含用于设置查询参数的具体方法,如 setOffset()setRange()
      • BasicPageableQuerySpec 通常用于用户实际创建查询对象时,提供了基本的分页查询逻辑。
  2. 功能

    • PageableQuerySpec

      作为接口,它可能只提供了一些方法声明,具体的实现和逻辑会由实现该接口的类提供。

    • BasicPageableQuerySpec

      提供了接口中的具体实现,可以设置查询的主要语句、偏移量、范围等参数,使得分页查询可以顺利进行。

  3. 使用场景

    • PageableQuerySpec

      开发者在需要定义分页查询的规范时,可以使用该接口类型作为参数或返回值。

    • BasicPageableQuerySpec

      开发者在实际创建分页查询对象时,通常会使用这个具体类。

三、案例
 public static void demo() throws Exception {
        long sessionID = 0;//会话ID,确保查询结束能关闭会话
        try {
            int offset = 0;//偏移量,从哪一条记录开始抓取数据
            int page_size = 1000;//设置每页数据大小,即步长
            BasicPageableQuerySpec bpqs = new BasicPageableQuerySpec();
            bpqs.setPrimaryStatement(new QuerySpec(WTPart.class.getName()));
            bpqs.setOffset(offset);
            bpqs.setRange(page_size);
            PagingQueryResult qr = (PagingQueryResult) PersistenceHelper.manager.find(bpqs);
            sessionID = qr.getSessionId();
            int count = 0;
            int totalCount = qr.getTotalSize();
            int pageCount = qr.size();
            int noOfPages = totalCount / pageCount;
            while (count < totalCount) {
                while (qr.hasMoreElements()) {
                    Object[] objs = (Object[]) qr.nextElement();
                    //TODO 业务代码处理
                    count++;
                }
                offset += qr.size();
                PageableQuerySpec pqs = new PagingSessionSpec(sessionID);//设置新的偏移量和范围(页大小),再次执行查询
                pqs.setOffset(offset);
                pqs.setRange(page_size);
                qr = (PagingQueryResult) PersistenceHelper.manager.find(pqs);
            }
        } finally {
            if (sessionID > 0) {
                PagingSessionHelper.closePagingSession(sessionID);//关闭分页会话,避免资源泄漏。
            }
        }
    }
四、案例截图

image-20241021111650669

注意事项:
  • 分页查询的临时结果会存储在PageResults/PagingSession表中
  • 临时表中的数据每30分钟会清理一次,如果查询时间超过30分钟会导致查询报错(清除队列为 commonScheduleQueue,清理的时间受wt.pom.paging.sessionCleanupTime控制)
    理一次,如果查询时间超过30分钟会导致查询报错(清除队列为 commonScheduleQueue,清理的时间受wt.pom.paging.sessionCleanupTime控制)
  • 分页查询会绕过wt.pom.queryLimit的限制,PagingQuery受db.properties中的 wt.pom.paging.snapshotQueryLimit配置限制,wt.pom.paging.snapshotQueryLimit=-1表示不限制查询总数量

http://www.kler.cn/news/365288.html

相关文章:

  • uv: 一个统一的Python包管理工具
  • AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)
  • JavaEE----多线程(二)
  • 数据类型【MySQL】
  • 异地组网最简单的方法
  • 【331】基于Springboot的“有光”摄影分享网站系统
  • 操作系统笔记(二)进程,系统调用,I/O设备
  • 使用LangGraph构建多Agent系统架构!
  • C++20中头文件syncstream的使用
  • JavaScript 有哪些学习资源
  • Rust使用config加载Toml配置文件
  • leetcode-75-颜色分类
  • 为Windows Terminal 配置zsh + Oh-My-Zsh!
  • 探索 SVG 创作新维度:svgwrite 库揭秘
  • 力扣80:删除有序数组中重复项
  • vue2+elementui日期选择器
  • UI 提供的 progress-step 要怎么实现?
  • 如何使用gitlab切换分支
  • 材质变体 PSO学习笔记
  • Excel重新踩坑3:条件格式;基本公式运算符;公式中的单元格引用方式;公式菜单栏其他有用的功能说明;
  • SSH 的 N 大黑科技玩法
  • 力扣 困难 52.N皇后II
  • 线性可分支持向量机的原理推导 9-28支持向量机优化中的可行性条件 公式解析
  • mysql的卸载与安装
  • 论文翻译 | A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT (下)
  • 【Javaee】网络原理—TCP协议的核心机制