我按照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中获取返回的行数,即使已经完全消耗了吗?
答案 0 :(得分:1)
all()返回剩余的行并清空List。因此,您将无法轻松获得处理的行数。但还有另一种选择,
如果您将LogAwareCallback中的onSuccess更改为
@Override
public void onSuccess(ResultSet rows) {
*int resultSize = rows.getAvailableWithoutFetching();*
log(query, parameters, resultSize);
origin.onSuccess(rows);
}
您将获得结果集中的行数而无需从数据库中获取其他行。这有一个警告,如果由于查询而预期的总行数大于页面大小,则只能得到(页面大小)作为输出。