2016-10-06 46 views
0

我發現了一個導致NoHostAvailableException的cassandra-driver-core庫的問題。卡桑德拉QueryBuilder的靜態變量選擇問題

<dependency> 
    <groupId>com.datastax.cassandra</groupId> 
    <artifactId>cassandra-driver-core</artifactId> 
    <version>3.1.0</version> 
</dependency> 

如果你有保存的列這樣一個靜態變量:

private static final Select.SelectionOrAlias allSelection = QueryBuilder.select(). 
      column("id"). 
      column("version_id"); 

好像有一個問題,當您使用查詢生成器,例如resuse靜態變量

Select s = allSelection.from(TABLE); 
s.where(QueryBuilder.eq("id", id)). 
       and(QueryBuilder.eq("version_id", version.getVersionId())); 

回答

0

圖書館將繼續在選擇添加的最後一列,VERSION_ID,到allSelection變量,最終將有大規模的列選擇查詢,將超時卡桑德拉節點,如果導致您正在運行羣集它將最終將所有節點從可用服務器池中取出,並且由於NoHostAvailable異常,任何查詢都將被拒絕。

可能的解決方案:

  1. 生成列變量每次使用它的時候
  2. 只是做一個選擇*或QueryBuilder.select()
  3. 使用預處理語句(推薦出於性能的考慮)

注意:cassandra-driver-core庫的版本3.0.0和3.1.0發生這種情況。不確定其他版本。