Cassandra - 有没有办法限制异步查询的数量?

时间:2015-05-28 14:12:17

标签: java asynchronous cassandra-2.0 datastax

我想知道是否有办法限制cassandra java驱动程序同时执行的查询数量?

目前,我按如下方式执行了很多查询:

... 
PreparedStatement stmt = session.prepare("SELECT * FROM users WHERE id = ?");
BoundStatement boundStatement = new BoundStatement(stmt);
List<ResultSetFuture> futures = Lists.newArrayListWithExpectedSize(list.length);

for(String id : list ) {
     futures.add(session.executeAsync(boundStatement.bind(id)));
}

for (ListenableFuture<ResultSet> future : futures) {
ResultSet rs = future.get();
... // do some stuff
}

不幸的是,这可能会导致NoHostAvailableException。

谢谢你。

1 个答案:

答案 0 :(得分:10)

您可以使用信号量来限制并发查询的数量:

final Semaphore semaphore = new Semaphore(numberOfConcurrentQueries);
...
semaphore.acquire();
try {
    ResultSetFuture future = session.executeAsync("...");
    Futures.addCallback(future, new FutureCallback<ResultSet>() {
        @Override
        public void onSuccess(ResultSet result) {
            semaphore.release();
        }

        @Override
        public void onFailure(Throwable t) {
            semaphore.release();
        }
    });
} catch (Exception e) {
    semaphore.release();
}

但是在一天结束时它并没有那么不同:当你超过容量时,不会得到NoHostAvailableException,信号量将阻塞(或者如果你使用定时版本的获取则抛出)。因此,您可能希望将背压应用于触发这些查询的组件。

您可能还想调整连接池以调整容量,请参阅our docs(2.1版本,如果您使用的话,请使用页面顶部的下拉列表。)