分页与扭曲

时间:2009-04-21 11:57:05

标签: pagination

我使用的是Struts 2框架,但这个问题不仅仅与Struts 2有关。

我想在我的网站上加入某种分页。假设我有一个我要在页面上显示的记录列表。该列表有150条记录,但我想在每页显示50条,所以在这种情况下将有3页。当然,列表将从DB中获取。

扭曲是我们有一个限制,如果查询超过7秒,它会被杀死(不要问)。因此,如果我们同时获得150条记录,则查询时间超过7秒。所以我们决定每次都获得50条记录。所以在这种情况下,我们将去DB 3次(50 50 50)。我们第一次获取总数(150),以便我们知道应该多少次返回数据库。

你们有些人可以分享你对如何处理这样的事情的看法吗?我知道有些人可能会说调整存储过程或查询是最好的选择,但这将是一条痛苦的道路,因为我们有大量的SP和查询。

我很感激任何例子。

3 个答案:

答案 0 :(得分:1)

第一次不需要进行实际获取,只能获取计数(聚合函数查询)。实时分页列表在非常大的数据集中很常见,唯一的问题是不能保证页面状态。也就是说,记录可能会插入到上一页的顺序中,从而在新页面中推送旧记录,反之亦然。尽管如此,它通常是可以接受的。

答案 1 :(得分:0)

您是否只是在寻找有关如何处理分页的一般提示?您认为应该只从数据库中获取所需的记录以保持查询较小,这是正确的。

不同的RDBMS具有枚举和分页记录的不同方法。 MySQL具有LIMIT关键字,MS SQL Server 2005及以上具有ROW_NUMBER()功能,而Oracle具有ROWNUM特殊列。根据您的RDBMS,应该很容易找到使用这些功能的示例。

答案 2 :(得分:0)

分页的示例查询使得您只获得有限数量的记录: -

select * from records limit $start,50

这里我假设您的原始查询是从记录中选择*。只需将您的原始查询附加“limit $ start,50”即可。这里当你想要前50条记录时,start应该等于0,要取50-100条记录,start应该等于50,对于100-150条记录,start应该等于100.通过将“limit $ start,50”附加到任何查询,查询从记录号$ start开始占用50条记录。我希望这能解决你的分页问题。