Java-Cassandra在“ IN”中具有大量参数

时间:2018-12-19 14:17:29

标签: java cassandra query-optimization

我正在用Cassandra DB编写Java应用程序。我正在'IN'子句中使用大量(超过100,000个)参数进行请求:

SELECT country, gender FROM persons WHERE person_id IN (1,7,18, 34,...,)

但是我认为在“ IN”中放入许多参数看起来很糟糕。

我也可以发出很多这样的请求(再次超过100,000次迭代):

for (Integer id : ids) {
    ResultSet res = session.execute(preparedStatement(id));
    //processing with data from Cassandra
}

也不要太长。

在我的情况下,有没有可以遵循的API,模式?

谢谢

1 个答案:

答案 0 :(得分:3)

如果person_id是分区键(从查询中看到),则使用IN会导致很多问题,因为它将使协调器节点过载,需要从其他节点收集结果。

在这种情况下,最有效的方法是触发单个请求,但通过executeAsync执行这些请求,因此它们将被发送到不同的节点。在这种情况下,您将需要控制已发送的请求数量(例如,通过对信号量进行计数),还可能需要对连接池参数进行计时,以控制进行中的请求数量:https://docs.datastax.com/en/developer/java-driver/3.6/manual/pooling/