spring - 为什么使用 Spring Data 进行分页查询比普通查询慢?

标签 spring hibernate spring-data spring-data-jpa jpql

假设我有一个简单的查询:

List<Customer> findByEntity(String entity);

此查询在 700 毫秒内返回 7k 条记录。

Page<Customer> findByEntity(String entity, Pageable pageable);

此查询在 1080 毫秒内返回 10 条记录。我知道分页的额外计数查询,但仍然有些问题。我还注意到一件奇怪的事情是,如果我将页面大小从 10 增加到 1900,响应时间完全相同,约为 1080 毫秒。

有什么建议吗?

最佳答案

这里确实可能是计数查询的成本较高。如果您坚持要了解集合中匹配的元素总数,则不幸的是没有办法绕过该附加查询。但是,如果您能够牺牲返回的信息,则有两种可能性可以避免更多开销:

  1. 使用 Slice 作为返回类型 - Slice 不会公开用于查找元素总数的方法,但它允许您找出下一个切片是否可用。我们通过读取比请求的元素多一个的元素并使用其(不)存在作为下一个切片可用性的指示器来避免此处的计数查询。
  2. 使用List作为返回类型 - 这将简单地将分页参数应用于查询并返回所选元素的窗口。但是,它不会让您了解后续数据是否可用。

关于spring - 为什么使用 Spring Data 进行分页查询比普通查询慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44021665/

相关文章:

java - 使用 @PostConstruct 时 Hibernate 无法找到绑定(bind)到线程的 session

java - Fasterxml - 如何从 json 文件中排除对象?

java - 捕获异常的 Spring 事务

java - 在异步任务中使用 Spring Data Session bean。范围 'session' 对于当前线程不活动

spring - Apache Myfaces +v2.2.0 的 StackoverflowError

java - Spring Security 和 Websockets - 未为框架处理程序设置身份验证

java - Spring Data JPA 查询

hibernate - 持久化设计的一般问题

sql - 与同一个表 QueryDSL hibernate 的多个连接

spring-data - 如何使用 Spring Data 中的 exists 关键字来检查实体是否存在?