如何在结果集消耗后获取已获取的行数?

时间:2016-10-14 10:52:36

标签: cassandra pagination

我按照the official cassandra website上的说明操作,以便以异步方式使用查询的结果集。

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()
);

这基本上可以正常工作但是为了查看已经获取了多少行,我将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
    }
}

问题是,包装的FutureCallback已经在此时消耗了整个结果集,并且我总是得到结果大小为0,尽管已经处理了多行。

因此我的问题是,如果有一种方法可以从ResultSet中获取返回的行数,即使已经完全消耗了吗?

1 个答案:

答案 0 :(得分:1)

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

如果您将LogAwareCallback中的onSuccess更改为

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

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