cassandra分页:分页状态为空,获取大小为空

ggazkfy8  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(518)

我们正在尝试制作一个从cassandradb为ui返回分页结果的应用程序。
ui将通过 fetchSize 以及 pagingState 我们将返回一个 List<MyObject>size=fetchSize . 如果 pagingState 通过后,我们将从最后一页继续查询(如cassandra docs中所述:https://docs.datastax.com/en/developer/java-driver/3.6/manual/paging/)
请注意,我使用的是cassandra驱动程序版本3.6。
但是当我们实现这个时,cassandra总是返回数据库中的所有条目,忽略fetch大小,这反过来会导致 null 的值 ResultSet.getExecutionInfo().getPagingState() . 我该怎么解决这个问题?
我在我的数据库中为 MyObject 并尝试将fetch size传递为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 变量。两个都没有按预期工作。
列表的大小是16(基本上它获取了所有的记录),由于上面的原因, pageStatenull 因为所有的记录都已经取出来了。
我错过了什么?
编辑:从观察 ResultSet 在语句中传递的大小,但是当我们将它Map到 List<MyObject> 使用 all() 方法,它获取数据库中的所有结果(大小=集群范围的fetchsize)。所以当我调用 Result#one 方法5(= pageSize )我得到了分页状态以及页面大小的结果。
上述示例方法

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;
}

这对性能有什么影响?

klr1opcd

klr1opcd1#

正如你所能辨别的,尽管你正在具体说明,你得到所有结果的原因是什么 setFetchSize 因为fetch size只是设置每个请求页的请求大小。当你调用 all() ,驱动程序将透明地分页浏览所有结果。
打电话 one() 与之相比,单独使用不会对性能产生影响 all() ,但是我建议您按照我的预期更改使用页面的逻辑 IntStream.range(1, pageSize) 如果已用尽结果集(即,将fetch size设置为500,但只有495行),则会失败。你可以用 IntStream.range(1, resultSet.getAvailableWithoutFetching()) .
您还可以选择迭代结果集,直到 ResultSet.isExhausted() 返回true以防止获取下一页。

相关问题