Cassandra 使用结果集后,如何获取获取的行数?

Cassandra 使用结果集后,如何获取获取的行数?,cassandra,pagination,Cassandra,Pagination,我按照上的说明以异步方式使用查询的结果集 ResultSetFuture future = session.executeAsync("SELECT release_version FROM system.local"); Futures.addCallback(future, new FutureCallback<ResultSet>() { @Override public void onSuccess(ResultSet result) {

我按照上的说明以异步方式使用查询的结果集

ResultSetFuture future = session.executeAsync("SELECT release_version FROM system.local");
Futures.addCallback(future,
    new FutureCallback<ResultSet>() {
        @Override public void onSuccess(ResultSet result) {
            gui.setMessage("Cassandra version is " + result.one().getString("release_version"));
        }

        @Override public void onFailure(Throwable t) {
            gui.setMessage("Error while reading Cassandra version: " + t.getMessage());
        }
    },
    MoreExecutors.sameThreadExecutor()
);
ResultSetFuture=session.executeAsync(“从system.local中选择发布版本”);
期货.addCallback(未来,
新未来回调(){
@成功时覆盖公共无效(结果集结果){
setMessage(“Cassandra版本是”+result.one().getString(“release_version”));
}
@失效时覆盖公共无效(可丢弃的t){
setMessage(“读取Cassandra版本时出错:“+t.getMessage()”);
}
},
MoreExecutors.sameThreadExecutor()
);
这基本上可以正常工作,但为了查看已获取了多少行,我将FutureCallback包装到LogAwareCallback中,有点简化,如下所示:

private static final class LogAwareCallback implements FutureCallback<ResultSet> {

    private final FutureCallback<ResultSet> origin;
    private final String query;
    private final Object [] parameters;

    private LogAwareCallback(
            FutureCallback<ResultSet> origin,
            String query,
            Object [] parameters) {
        this.origin = origin;
        this.query = query;
        this.parameters = parameters;   
    }

    @Override
    public void onSuccess(ResultSet rows) {
        origin.onSuccess(rows);

        // as all rows should have been processed at this state,
        // it should be safe to call all with size now
        int resultSize = rows.all().size();
        log(query, parameters, resultSize);             
    }

    @Override
    public void onFailure(Throwable throwable) {
        // FAILURE HANDLING...
    }

    private void log(String query, Object [] parameters, int resultSize) {
        // LOG result size for given query
    }
}
private静态最终类LogAwareCallback实现未来回调{
私人最终未来;
私有最终字符串查询;
私有最终对象[]参数;
私人LogAwareCallback(
未来的起源,
字符串查询,
对象[]参数){
this.origin=origin;
this.query=query;
此参数=参数;
}
@凌驾
成功时公共无效(结果集行){
origin.onSuccess(行);
//由于所有行都应在此状态下进行处理,
//现在打电话给所有大小的人应该是安全的
int resultSize=rows.all().size();
日志(查询、参数、结果大小);
}
@凌驾
失败时的公共无效(可丢弃){
//故障处理。。。
}
私有无效日志(字符串查询,对象[]参数,int resultSize){
//给定查询的日志结果大小
}
}
但问题是,包装的FutureCallback此时已经消耗了整个结果集,尽管已经处理了多行,但结果大小始终为0

因此,我的问题是,是否有一种方法可以从ResultSet获取返回行的计数,即使它已被完全使用

all()返回剩余的行并清空列表。因此,您将无法轻松获得处理的行数。但还有一种选择

如果您将LogAwareCallback中的onSuccess更改为

@Override
    public void onSuccess(ResultSet rows) {
        *int resultSize = rows.getAvailableWithoutFetching();*
        log(query, parameters, resultSize); 
        origin.onSuccess(rows);                    
    }

您将获得结果集中的行数,而无需从数据库中获取其他行。这有一个警告,如果查询结果预期的总行数大于页面大小,则只能将该行数(页面大小)作为输出。

我也尝试了此操作,但结果大小也为0。您在调用origin.onSuccess(rows)之前尝试了此操作;它还是给了你0?然后它还印了“卡桑德拉版本是…”?啊,我明白了。抱歉,我不知道您更改了对账单的顺序。我假设getAvailableWithoutFetching是一个相当轻量级的操作?是的,我也这么认为,因为它在分页期间的早期获取中也使用了很多时间。但由于我不知道内部驱动程序代码,您可能希望在生产代码中使用之前进行基准测试。相当出色。这解决了你的问题吗?谢谢