gpt4 book ai didi

java - Cassandra 分页使用 Datastax 驱动程序 3.6 : Null paging state and fetch size not honoured

转载 作者:搜寻专家 更新时间:2023-11-01 09:20:18 28 4
gpt4 key购买 nike

我们正在尝试制作一个从 cassandra 数据库为 UI 返回分页结果的应用程序。

UI 将通过 fetchSizepagingState到我们的 API 并基于它我们将返回 List<MyObject>size=fetchSize .如果pagingState通过我们将从最后一页恢复查询(如 cassandra 文档中所述:https://docs.datastax.com/en/developer/java-driver/3.6/manual/paging/)

请注意,我使用的是 Cassandra 驱动程序版本 3.6。

但是当我们实现这个时,Cassandra 总是返回数据库中的所有条目而忽略获取大小,这反过来会导致 null ResultSet.getExecutionInfo().getPagingState() 的值.我该如何解决这个问题?

我在数据库中为 MyObject 创建了 16 条记录并尝试将获取大小传递为 5 以获取它们。所有 16 条记录都具有相同的分区键 ID-1 .

// Util method to invoke Statement. "session" is cassandra session 

public static ResultSet execute(int pageSize, Statement statement, String pageState) {
if (isVoid(pageSize)) {
pageSize=-1;
}
statement.setFetchSize(pageSize);
if (!isVoid(pageState)) {
statement.setPagingState(PagingState.fromString(pageState));
}
return session.execute(statement);
}

// Accesor interface method for my query that returns a Statement
object

@Query("SELECT * FROM " + MY_TABLE + " WHERE id=:id")
Statement getAll(@Param("id") String id);

// Main Code returning list of MyObject that has an object Mapper ->
//mapper
Statement statement=accessor.getAll("ID1");
ResultSet rs=execute(5,statement,null );
List<MyObject> list=mapper.map(rs).all();
String pageState=rs.getExecutionInfo().getPagingState();

在上面的代码中,我希望 Cassandra 返回一个包含 5 MyObject 的列表。对象并为我的 pageState 提供一个字符串值多变的。两者都没有按预期工作。

List 的大小为 16(基本上它获取了所有记录)由于以上原因,pageStatenull因为所有记录都已提取。

我在这里错过了什么?

编辑:来自观察ResultSet将尊重语句中传递的 fetchSize,但是当我们将其映射到 List<MyObject> 时使用 all()方法,它获取数据库中的所有结果(大小 = Cluster wide fetchSize)。所以当我调用 Result#one方法 5(= pageSize ) 次并将它们推送到列表中,我得到了分页状态以及页面大小的结果。

上面的示例 Util 方法

public static <T> List<T> getPaginatedList(ResultSet resultSet, Mapper<T> mapper,int pageSize) {
List<T> entities=new ArrayList<>();
Result<T> result=mapper.map(resultSet);
IntStream.range(1,pageSize).forEach(i->{
entities.add(result.one());
});
return entities;
}

这对性能有何影响?

最佳答案

如您所见,尽管您指定了 setFetchSize,但您得到所有​​结果的原因是提取大小只是设置了每个请求页面的请求大小。当您调用 all() 时,驱动程序会透明地翻阅所有结果。

all() 相比,单独调用 one() 不会对性能产生影响,但是我建议按照我的预期更改使用页面的逻辑IntStream.range(1, pageSize) 如果您用尽了结果集(即您将提取大小设置为 500,但只有 495 行),则会失败。相反,您可以使用 IntStream.range(1, resultSet.getAvailableWithoutFetching())

您还可以选择遍历结果集,直到 ResultSet.isExhausted() 返回 true 以防止获取下一页。

关于java - Cassandra 分页使用 Datastax 驱动程序 3.6 : Null paging state and fetch size not honoured,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56577393/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com