我在一个员工表中有3000条记录,我用一个查询从数据库中提取了这些记录。我每页可以显示20条记录。所以每页有150页,显示20条记录。关于分页和可排序列方法,我有两个问题:
1)如果我实现了一个没有可排序列的简单分页,我应该将所有3000条记录发送到客户端并使用javascript或jquery进行分页客户端。因此,如果用户点击第二页,则呼叫将不会转到服务器端,而且速度会更快。 虽然我不确定在浏览器/客户端发送3000条或更多条记录会产生什么影响?那么什么是最好的方法是将所有记录一次性发送到客户端并在那里进行排序或点击页面将调用发送到服务器端然后只返回特定页面结果?
2)在这种情况下,我需要提供分页以及可排序的列(6列)。所以这里用户可以点击任何列,如员工姓名或部门名称,然后名称应按升序或降序排列。 我想再次了解时间响应/记忆方面的最佳方法吗?
答案 0 :(得分:7)
向您的客户端发送数据几乎肯定会成为您的瓶颈(特别是对于移动客户端),因此您应该始终尽可能少地发送数据。话虽如此,在服务器端进行分页几乎肯定更好。这是一个更具伸缩性的解决方案。数据量可能会增长,所以对于将来在服务器上进行分页是一个更安全的选择。
此外,请记住,任何用户都不太可能会费心查看数百个结果页面,因此传输所有数据也可能会造成浪费。 This可能是适合您的阅读。
答案 1 :(得分:1)
我假设你有一个bean类代表这个表中的记录,实例从你现有的任何ORM加载。
如果您还没有,则应在应用程序中实现这些bean的缓存。这可以在本地完成,可能使用Guava的CacheBuilder
,或远程使用Memcached调用(后者对于多个app服务器/负载平衡是必需的)。这些bean的缓存应该键入唯一的id,很可能是映射到相应表的主键列。
进入分页:只需编写查询以仅返回所选记录的ID。包括LIMIT
和OFFSET
或您的DB语言等效于分页。查询的来电者还可以使用WHERE
,ORDER BY
等随意过滤/排序。
回到Java层,遍历这些查询的结果ID,并通过调用缓存来构建List
个bean。如果缓存未命中,它将调用您的ORM单独查询并加载该bean。构建List
后,可以对其进行处理/序列化并将其发送到用户界面。
答案 2 :(得分:1)
我知道这不会直接回答客户端与服务器端的分页,但我建议使用DataTables.net来显示和分页数据。它提供了非常好的显示,允许排序和分页,内置搜索功能,以及更多。我第一次使用它是为了我工作的第一个Web项目,作为一个完整的noobie,我能够让它工作。论坛还提供了非常好的信息/帮助,创作者将回答您的问题。 DataTable可以在客户端和服务器端使用,并且可以支持数千行。 至于速度,我只有几百行,但使用了客户端处理,从未注意到延迟。
答案 3 :(得分:1)
使用服务器PAGINATION!
当然,您可能会发送一个包含3000个元素的JSON数组并使用JavaScript在客户端上进行分页/排序。但是一个优秀的网络程序员应该知道如何在服务器上分页和排序记录。 (他们应该知道几种方式)。因此,将其视为良好做法:)
如果您想要一个灵活的用户界面,请考虑使用使用AJAX获取数据的JavaScript grid component。通常,这些组件会传回以下参数(或其中的一些变体):
开发人员需要实现一个基于这些输入参数返回结果集的处理程序或接口。