我们正在尝试制作一个从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(基本上它获取了所有的记录),由于上面的原因, pageState
是 null
因为所有的记录都已经取出来了。
我错过了什么?
编辑:从观察 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;
}
这对性能有什么影响?
1条答案
按热度按时间klr1opcd1#
正如你所能辨别的,尽管你正在具体说明,你得到所有结果的原因是什么
setFetchSize
因为fetch size只是设置每个请求页的请求大小。当你调用all()
,驱动程序将透明地分页浏览所有结果。打电话
one()
与之相比,单独使用不会对性能产生影响all()
,但是我建议您按照我的预期更改使用页面的逻辑IntStream.range(1, pageSize)
如果已用尽结果集(即,将fetch size设置为500,但只有495行),则会失败。你可以用IntStream.range(1, resultSet.getAvailableWithoutFetching())
.您还可以选择迭代结果集,直到
ResultSet.isExhausted()
返回true以防止获取下一页。