【问题标题】:Paging SELECT query results from Cassandra in Spring Boot application在 Spring Boot 应用程序中从 Cassandra 分页 SELECT 查询结果
【发布时间】:2017-05-14 18:33:33
【问题描述】:
在我的研究过程中,我遇到了 Spring-Data-Cassandra 的这个 JIRA:
https://jira.spring.io/browse/DATACASS-56
现在,根据上面的帖子,由于 Cassandra 的结构,目前 SDC 不支持 Spring App 中的分页。但是,我在想,如果我可以将整个行列表拉到 Java 列表中,我可以对该列表进行分页吗?我在 Spring 方面没有太多经验,但是当我认为可以做到这一点时,我是否缺少一些东西?
【问题讨论】:
标签:
spring
spring-boot
spring-data-jpa
spring-data-cassandra
【解决方案1】:
Cassandra 不支持指向特定页面(限制/偏移)的分页,但会生成一个延续令牌 (PagingState),它是一组 bytes。拉取List 的记录会将所有记录加载到内存中,并可能耗尽您的内存(取决于数据量)。
Spring Data Cassandra 1.5.0 RC1 在CassandraTemplate 中带有一个streaming API:
Iterator<Person> it = template.stream("SELECT * FROM person WHERE … ;", Person.class);
while(it.hasNext()) {
// …
}
CassandraTemplate.stream(…) 将返回一个在底层ResultSet 上运行的Iterator。 DataStax 驱动程序使用可配置的提取大小(默认为5000 行)进行批量提取。流式数据访问可以获取处理数据所需的尽可能多或尽可能少的数据。驱动程序和 Spring Data Cassandra 都不会保留数据,一旦从 Iterator 检索到获取的批量,底层 ResultSet 将自行获取下一个批量。
另一种选择是直接使用ResultSet,这样您就可以访问PagingState,并自己完成所有的继续/分页业务。您将失去 Spring Data Cassandra 的所有更高级别的好处。