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