2015-05-28 68 views
1

我想知道是否有方法限制cassandra java驅動程序同時執行的查詢數量?Cassandra - 有沒有辦法限制異步查詢的數量?

目前,我執行了許多疑問如下:

... 
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。

謝謝你。

+0

您是不是每次按照實現它的方式覆蓋'executeAsync'? –

+0

對不起,我更新了我的代碼。 – fhussonnois

回答

6

您可以使用一個信號量節流並行查詢的數量:在它不是那麼不同的一天結束

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,如果使用2.0,請使用頁面頂部的下拉列表)。

相關問題