使用jdbcTemplate进行分页

时间:2013-01-23 04:34:18

标签: java sql spring jdbc

我们现在面临的一个问题是处理从数据库中获取的大ResultSet的分页。

目前,作为SQL存储过程返回的行将jdbcTemplate.query范围从100K调用到300K,并且分页在extractData方法内完成。

用户显示的页面只有20行。

这非常慢,有没有办法使用jdbcTemplate从存储过程的结果中获取数据页。

3 个答案:

答案 0 :(得分:2)

您可以查看this

一个很好的例子。

答案 1 :(得分:1)

我认为JdbcTemplate没有特定的分页功能。但是,即使这样做也可能无法帮助您的代码运行得更快。

通常,面向用户页面的大小不超过200行,因此查询100-300K行似乎过多,浪费了大量内存。

您需要首先确定要使用哪种寻呼策略。两种常见的策略是查询前N个页面,并将其存储在临时缓存中 - 或者仅查询足以填充一个页面大小(例如:200行),并且仅在用户请求时才查询接下来的200行。

您还需要确定缓慢的真正原因是什么。行大小是一个因素,但不是唯一的因素。您必须分析架构结构,索引,查询连接等。

在正常使用情况下请记住 - 尽管您可以向用户显示多达10000页,但典型用户不太可能浏览所有这些页面 - 可能只有前5-10页很重要 - 因此如果可以的话,将结果集限制为较小的数字会更有意义

答案 2 :(得分:-2)

对于新版本的SpringBoot来说,这已经很晚了,但很高兴。

看看PageImpl

/**
 * Basic {@code Page} implementation.
 * 
 * @param <T> the type of which the page consists.
 * @author Oliver Gierke
 */
public class PageImpl<T> extends Chunk<T> implements Page<T>

构造

/**
 * Constructor of {@code PageImpl}.
 * 
 * @param content the content of this page, must not be {@literal null}.
 * @param pageable the paging information can be {@literal null}.
 * @param total the total amount of items available. The total might be adapted considering the length of the content
 *          given, if it is going to be the content of the last page. This is in place to mitigate inconsistencies
 */
public PageImpl(List<T> content, Pageable pageable, long total)

希望这有帮助!