Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法限制异步查询的数量?_Java_Asynchronous_Cassandra 2.0_Datastax - Fatal编程技术网

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

Java 有没有办法限制异步查询的数量?,java,asynchronous,cassandra-2.0,datastax,Java,Asynchronous,Cassandra 2.0,Datastax,我想知道是否有办法限制CassandraJava驱动程序同时执行的查询数量 目前,我执行了很多查询,如下所示: ... PreparedStatement stmt = session.prepare("SELECT * FROM users WHERE id = ?"); BoundStatement boundStatement = new BoundStatement(stmt); List<ResultSetFuture> futures = Lists.newArrayL

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

目前,我执行了很多查询,如下所示:

... 
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
}
。。。
PreparedStatement stmt=session.prepare(“从id=?”的用户中选择*”;
BoundStatement BoundStatement=新的BoundStatement(stmt);
List futures=Lists.newArrayListWithExpectedSize(List.length);
用于(字符串id:列表){
futures.add(session.executeAsync(boundStatement.bind(id));
}
适用于(上市未来:期货){
ResultSet rs=future.get();
…做点什么
}
不幸的是,这可能导致NoHostAvailableException


谢谢。

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

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();
}
最终信号量信号量=新信号量(numberOfConcurrentQueries);
...
semaphore.acquire();
试一试{
ResultSetFuture=session.executeAsync(“…”);
Futures.addCallback(future,newfuturecallback(){
@凌驾
成功时公共无效(结果集结果){
semaphore.release();
}
@凌驾
失效时的公共无效(可丢弃的t){
semaphore.release();
}
});
}捕获(例外e){
semaphore.release();
}
但最终也没什么不同:当您超过容量时,信号量将被阻塞(如果您使用定时版本的acquire,则会抛出),而不是获得
NoHostAvailableException
。因此,您可能还希望对触发这些查询的组件应用背压

您可能还需要调整连接池以调整容量,请参阅(对于2.1,如果您使用的是2.0,请使用页面顶部的下拉列表)