我可以用jqGrid实现延迟加载吗?

2023-12-04

我有一个包含超过 5000 条数据记录的网格。该数据每天都在增长。当我加载带有网格的页面时,网格几乎需要一分钟才能显示我必须一次显示 10 行的数据。

那么是否可以用这个jqGrid实现延迟加载呢?

这是我生成 JSON 字符串的操作:

@RequestMapping(value = "studentjsondata", method = RequestMethod.GET)
public @ResponseBody String studentjsondata(HttpServletRequest httpServletRequest) {
    Format formatter = new SimpleDateFormat("MMMM dd, yyyy");
    String column = "id";
    if(httpServletRequest.getParameter("sidx") != null){
        column = httpServletRequest.getParameter("sidx");
    }
    String orderType = "DESC";
    if(httpServletRequest.getParameter("sord") != null){
        orderType = httpServletRequest.getParameter("sord").toUpperCase();
    }
    int page = 1;
    if(Integer.parseInt(httpServletRequest.getParameter("page")) >= 1){
        page = Integer.parseInt(httpServletRequest.getParameter("page"));
    }
    int limitAmount = 10;
    int limitStart = limitAmount*page - limitAmount;
    List<Student> students = Student.findAllStudentsOrderByColumn(column,orderType,limitStart,limitAmount).getResultList();  
    List<Student> countStudents = Student.findAllStudents();
    double tally = Math.ceil(countStudents.size()/10.0d);
    int totalPages = (int)tally;
    int records = countStudents.size();


    StringBuilder sb = new StringBuilder();
    sb.append("{\"page\":\"").append(page).append("\", \"records\":\"").append(records).append("\", \"total\":\"").append(totalPages).append("\", \"rows\":[");
    boolean first = true;
    for (Student s: students) {
        sb.append(first ? "" : ",");
        if (first) {
            first = false;
        }
        sb.append(String.format("{\"id\":\"%s\", \"cell\":[\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"]}",s.getId(), s.getId(), s.getFirstName(), s.getLastName(),  formatter.format(s.getDateOfBirth().getTime()), s.getGender(), s.getMaritalStatus()));
    }
    sb.append("]}");
    return sb.toString();
}

这是 jqGrid 的页面:

$("#studentGrid").jqGrid({
            url: '/starburst/programmes/studentjsondata',
            datatype: 'json',
            height: 'auto',
            colNames:['id','First Name', 'Last Name', 'Date Of Birth', 'Gender', 'Marital Status'], 
            colModel:[ 
                {name:'id',index:'id', width:15}, 
                {name:'firstName',index:'firstName', width:30, formoptions:{elmprefix:'(*) '}, editable:true, edittype: 'text', editrules:{required:true}},
                {name:'lastName',index:'lastName', width:30, formoptions:{elmprefix:'(*) '}, editable:true, edittype: 'text',editrules:{required:true}},
                {name:'dateOfBirth',index:'dateOfBirth', width:30, formoptions:{elmprefix:'(*) '},editrules:{required:true}, editable:true, edittype: 'text',               
                    editoptions: {
                        dataInit: function(element) {
                            $(element).datepicker({dateFormat: 'MM dd, yy'})
                        }
                    } 
                },                    
                {name:'gender',index:'gender', width:30, formoptions:{elmprefix:'(*) '}, editable:true, editrules:{required:true}, edittype: 'select',
                    editoptions:{value:{}}
                },
                {name:'maritalStatus',index:'maritalStatus', width:30, formoptions:{elmprefix:'(*) '}, editable:true, editrules:{required:true}, edittype: 'select',
                    editoptions:{value:{}}
                }                    
            ],
            rowNum:10,
            autowidth: true,
            pager: '#pager', 
            sortname: 'id', 
            viewrecords: true, 
            sortorder: "desc",
            caption:"Students",
            emptyrecords: "Empty Records",
            subGrid: true,
            /* <![CDATA[ */ 
            onSelectRow: function(id){ 
                if((lastsel != 0)&&(id!==lastsel)){ 
                    $("#studentGrid").jqGrid('collapseSubGridRow', lastsel);                
                } 
                lastsel=id; 
            }/* ]]> */ 
        });
        $("#studentGrid").jqGrid('navGrid', "#pager", {edit:false,add:false,del:false,search:true},{ },{ },{ },
        { 
            sopt:['eq', 'ne', 'lt', 'gt', 'cn', 'bw', 'ew'],
            closeOnEscape: true, 
            multipleSearch: true, 

请参阅下面的查询:

public static TypedQuery<tt.edu.sbcs.model.Student> findAllStudentsOrderByColumn(String column, String orderType, int limitStart, int limitAmount) {
    EntityManager em = Programme.entityManager();
    TypedQuery<Student> q = em.createQuery("SELECT o FROM Student AS o ORDER BY"+" "+column+" "+orderType, Student.class);
    q.setFirstResult(limitStart);//used to skip the first "N"  elements form the result set, it indexes results form zero 
    q.setMaxResults(limitAmount);
    return q;
}

我在上述操作中设置的限额。该值为 10。


首先,我发现在 1 分钟内加载 5000 行中的 10 行是非常慢。我认为在你的情况下,服务器代码而不是 jqGrid 是瓶颈。

首先非常怀疑你的代码行是

List<Student> countStudents = Student.findAllStudents();

你只需要得到号码的学生,但似乎你得到了所有学生的所有财产然后使用countStudents.size()在接下来的两行中。最大应该做的事情是这样的

SELECT COUNT(*) FROM dbo.Students

相反,这意味着你这样做SELECT * FROM dbo.Students.

可能是你的数据库或者函数的实现有严重的问题findAllStudentsOrderByColumn如果你的代码需要 1 分钟。也许您有一些代表实体模型或数据库模型的类。如果性能如此糟糕,您必须非常仔细地检查进行数据库访问的代码,或者考虑使用一些更直接的数据库访问方式,您可以在其中直接指定数据库查询。我不是 Java 或 Spring 开发人员,但我可以明确地说,如果 5000 中的 10 行请求得到更多,1 second比它已经太慢了。

看起来您需要从一个表中返回一些列,包括id。所以你可以通过以下方式获取数据SELECT like

SELECT TOP(10) id, firstName, lastName, dateOfBirth, gender, maritalStatus
FROM dbo.Students
ORDER BY id

获取第一页数据和类似以下内容

WITH GetAll (id, firstName, lastName, dateOfBirth, gender, maritalStatus) AS (
    SELECT id, firstName, lastName, dateOfBirth, gender, maritalStatus
    FROM dbo.Students
    ORDER BY id
), GetTop (id, firstName, lastName, dateOfBirth, gender, maritalStatus) AS (
    SELECT TOP(20) * FROM GetAll -- skip 2 pages per 10 rows
), GetNext (id, firstName, lastName, dateOfBirth, gender, maritalStatus) AS (
    SELECT TOP(10) a.* FROM GetAll AS a
        LEFT OUTER JOIN GetTop AS t ON t.id = a.id
    WHERE t.id IS NULL
)
SELECT * FROM GetNext

对于所有下一页。我用了公用表表达式 (CTE)语法,但如果您的数据库不支持,您可以使用子查询。

因为您允许按每一列排序,所以您应该在表中的每一列上创建索引以提高排序性能。 (我认为Students表每秒不会有很多变化,因此索引不会降低表的性能)。

您应该考虑的另一件事是将序列化更改为 JSON。的用法String.format("\"%s\", someString)很危险。有一些字符必须使用转义\特点。我是说" and \。您应该这样做以确保代码安全。常见的做法是使用您的语言中现有的一些标准类进行序列化(请参阅here or here例如)。

下一个技巧是使用jsonReader: {cell: ""}并返回表单中该行的数据

["%s", "%s", "%s", "%s", "%s", "%s"]

代替

{"id":"%s", "cell":["%s", "%s", "%s", "%s", "%s", "%s"]}

你不会发送id值两次并且不会发送字符串"id"“cell”和其他一些不需要的字符('{',':',...)。

在客户端你应该always use gridview: truejqGrid 选项。对于 10 行数据,您不会看到严重的差异,因为 jqGrid 会非常快,但是对于更多行,差异将非常明显。

最后的建议:你应该使用formatter: 'date'并将日期发送到ISO 8601格式:像2012-03-20.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以用jqGrid实现延迟加载吗? 的相关文章

随机推荐

  • OpenCV 中的形态重建

    在 OpenCV 中处理带有文本的图像时 我的打开操作不会产生正确的输出数据 该问题与本文中描述的问题非常相似 http www cpe eng cmu ac th wp content uploads CPE752 06part2 pdf
  • roadoi 中的 UseMethod("http_error") 错误

    我正在尝试roadoi从 R 访问 Unpaywall 但无论我尝试查询什么 我都会得到以下响应 UseMethod http error 中的错误 没有适用的方法 http error 应用于类 c simpleError error 健
  • C++ 函数地址在附加探查器库中的显示与主题代码库中的显示不同

    我用 C 编写了一个仪器 通过挂钩进入和退出调用来记录进入和退出函数 它按照预期与遗留代码库一起工作 然而 在挂钩我从 git 下载的项目时 我保存在主题代码的 extern 变量中的函数地址 它们在探查器库中的结果是不同的 这扰乱了挂钩函
  • 选择特定组件时,Inno Setup 禁用组件选择

    我希望能够根据所选的特定组件禁用对组件的选择 我无法通过组件嵌套来做到这一点 因为组件需要自行选择 但如果选择了另一个特定组件则不能选择 目前我使用NextButtonClick显示消息的事件 if IsComponentSelected
  • Html 复选框:更改颜色

    在开发 NET 应用程序期间 我遇到了一个问题 我想做的是改变一个简单的 Html 复选框的背景颜色 所以我使用了以下 HTML 代码
  • CSS 过渡自动高度不起作用[重复]

    这个问题在这里已经有答案了 我有一个网站 我决定用纯 CSS 片段替换基于 jquery 的切换框 当我使用固定高度值进行过渡 CSS 的最后几行 时 效果很好 但是使用auto值 缺少动画 只有高度变化才有效果 有没有办法将其与自动值一起
  • 我可以在 PHP 中使用 PDO 创建数据库吗?

    我想创建一个使用 PDO 与 MySQL 交互的类 我可以使用 PDO 创建新的 MySQL 表吗 是的你可以 The dsnPart 是 PDO 构造函数的第一个参数 不必有数据库名称 你可以简单地使用mysql host localho
  • `plot.密度` 将“xlim”扩展到我的数据范围之外。为什么以及如何解决它?

    使用下面的代码 我试图获取不同分布的密度图 dens lt apply df c 7 9 12 14 16 18 2 density plot NA xlim range sapply dens x ylim range sapply de
  • 为什么属性在编译期间需要显式键入?

    使用属性语法的编译要求在编译时知道接收器的类型 我可能不明白某些东西 但考虑到 Objective C 是一种动态语言 这似乎是一个损坏或不完整的编译器实现 属性 comment 定义为 property nonatomic retain
  • 在 Javascript 中捕获按键(Google 文档)

    我正在尝试编写一个小greasemonkey 脚本 书签 你有什么Google 文档 我想添加的功能需要一个 keypress keyup keydown 事件处理程序 这三个之一 不幸的是 Javascript 不是我的强项 而且我似乎无
  • 并发块如何运行单个 GPU 流式多处理器?

    我正在研究CUDA编程结构 学习后的感受是 创建块和线程后 每个块都会分配给每个流式多处理器 例如 我使用的是 GForce 560Ti 它有 14 个流式多处理器 因此一次可以将 14 个块分配给所有流式多处理器 但当我浏览一些在线材料时
  • 使用.NET读取Delphi TClientDataset文件

    我需要使用 NET 代码读取使用 Delphi 中的 TClientDataset 类编写的文件 提到的解决方案here对我不起作用 一个不在Windows平台上运行的dotNet程序 对我来说意味着您正在部署 Mono 应用程序 可能在
  • Android:如何从活动堆栈中完全删除活动?

    我有两个活动 FirstActivity 和 SecondActivity FirstActivity 有一个意图过滤器 MAIN LAUNCHER 和 DEFAULT SecondActivity 只是一个普通的 Activity And
  • C++ 数字精度和 fstream 截断

    我有一个包含数百个数字的 file txt 它们在点后有很多数字 最多 20 个 我需要在不截断的情况下获取所有数字 否则它们会在以下计算中引入错误 我用 matlab 生成了这些数字 因此它具有极高的精度 但现在我必须在我的程序中复制这种
  • 从行中选择第 i 个最高值并分配给新列的最快方法

    我正在寻找一种解决方案 将新列添加到现有数据框 数据表中 这是每个单独行中的第 i 个最高值 例如 如果我想要第四个最高值 则新列的第一行将包含 1 9 data lt data frame a c a a b b c a peak1 c
  • C# 自顶向下解析实现

    我想用 c 语言实现自上而下的解析 有没有任何资源可以告诉我方法 我的意思是实现或算法的良好方法和描述 例如 以下是一些实施步骤 1 发展语法2 LL1解析3 构造解析器 这些步骤是按顺序排列的 顺序对于给您正确的答案非常重要 以下 MSD
  • 如何放大和缩小画布中的文本大小,tkinter python

    我创建了一个画布小部件并添加了一些对象 例如矩形和文本 我还在鼠标滚轮上绑定了缩放功能 它适用于矩形 但是 它不适用于文本 我想让缩放也适用于文本 但我找不到方法 任何帮助 将不胜感激 class Layout tk Frame def i
  • 计算图像地图上多边形区域的宽度和高度

    是否可以使用坐标计算图像地图上每个多边形区域的宽度和高度 我有一个图像并使用具有多个不同大小的多边形的图像贴图 我需要找到每一个的中心点 要找到中心点 您需要找到多边形的最小和最大X和Y坐标 然后取每个多边形的中点以获得平均中心点 这是一个
  • 如何使用 C++/CLI 包装器将变量参数从托管传递到非托管?

    要在托管域中实现 params 变量参数 功能 我们在 c cli 中执行以下操作 例如 funcManaged int n array
  • 我可以用jqGrid实现延迟加载吗?

    我有一个包含超过 5000 条数据记录的网格 该数据每天都在增长 当我加载带有网格的页面时 网格几乎需要一分钟才能显示我必须一次显示 10 行的数据 那么是否可以用这个jqGrid实现延迟加载呢 这是我生成 JSON 字符串的操作 Requ