管理返回大量数据的ajax调用

时间:2016-05-25 08:46:11

标签: jquery ajax

我有一个ajax电话:

$.ajax({
    async: false, // you are better off leaving this false
    url: "/api/rest/v1/" 
        + tblMonthlyBudgetCat 
        + "/read?fields=io_uuid,ml_import_key,ml_learning_solution_project_id,ml_monthly_budget_lp,ml_related_budget_categories",
    type: "POST", // change this for PUT to edit records, or DELETE to.. delete.
    dataType: "json",
    data: JSON.stringify(filter), 
    success: function(rec) {
        // do something
    }
});

但它从中提取数据的表返回一个大数据集。此外,某些数据应该要求某些用户访问权限。因此,当这些用户尝试运行脚本时,需要花费大量时间来执行,这实际上会导致超时并且谷歌浏览器崩溃,我们需要杀死脚本。

如何管理:

1)使用大量数据进行Ajax调用以更快地运行

2)管理/绕过权限以使其运行更快

1 个答案:

答案 0 :(得分:0)

你需要重新考虑你的" REST" API。它根本不是RESTful。您刚刚直接在数据库中创建了一个危险的窗口。

/read?fields=io_uuid,ml_import_key,ml_learning_solution_project_id

资源应该是预先定义的东西。有一个"摘要"和一个完整的"版本(后者是前者的子类)但不应该有特定列式访问的概念。你不应该只允许随机访问"窗口进入您的数据库,因为它既有性能和安全风险。

将您的资源设计得足够苗条,既有用又不臃肿,使用链接(请参阅HATEOAS)查看子对象。不要让像Hibernate这样的ORM拉回巨大的对象图。数据不仅数量巨大,而且您可能会创建一个N + 1问题,您可以发出许多(可能是数万个)SQL语句来获取这些数据。

正如另一位评论者所说,使用一个允许分页的强大列表容器。您可以在服务器端缓存查询结果,以便快速浏览页面。 "之前"和" next"页面链接应该在您的列表容器中。您可以使用这种访​​问方法在引擎盖下实现无限滚动。理解REST中的列表和包非常简单,但却是一个强大的概念。

另外,请注意您正在使用POST来查找基于查询字符串的GET,这也不是很好的做法,因为您无法在浏览器层缓存,即使您想要(您可能不希望如果数据快速移动)。

除非绝对必须,否则不要将数据大小管理推送到您的客户端。并且绝对不会将编辑或auth + auth推送到客户端。你的服务器端应该负责这个。

您不必完全饮用REST koolaid,例如,您可能会为更新保留更多RMI样式(某些项目会这样做),但是对于读取数据,结构和访问路径对于走吧它们应该几乎是自我记录的,一致的,有凝聚力的和幂等的。如果您执行所有这些操作,您的API将易于使用,并且不会给您的用户带来任何问题。

作为最后一点,您对复杂查询的查询字符串的使用可能会限制在限制长度的浏览器上,如果您确实需要一个非常复杂的查询,您可以使用POST但使用正文而不是查询字符串。