具有静态变量的Cassandra QueryBuilder选择问题

时间:2016-10-06 19:50:16

标签: java cassandra

我发现cassandra-driver-core库存在问题,导致NoHostAvailableException。

<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"); 

使用查询构建器重新使用静态变量时似乎存在问题,例如

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

1 个答案:

答案 0 :(得分:0)

库将继续将选择中的最后一列(version_id)添加到allSelection变量中,最终将导致大量列选择查询超时到Cassandra节点,如果您正在运行集群,它最终会占用所有由于NoHostAvailable异常,您的节点将从可用服务器池中退出,并且任何查询都将被拒绝。

可能的解决方案:

  1. 每次使用时生成列变量
  2. 只需选择*或QueryBuilder.select()
  3. 即可
  4. 使用准备好的陈述(出于性能原因推荐)
  5. 注意:对于我来说,这是cassandra-driver-core库的3.0.0和3.1.0版本。不确定其他版本。