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是一个相当轻量级的操作?是的,我也这么认为,因为它在分页期间的早期获取中也使用了很多时间。但由于我不知道内部驱动程序代码,您可能希望在生产代码中使用之前进行基准测试。相当出色。这解决了你的问题吗?谢谢