Java - 在 "IN"中有大量参数的 Cassandra

标签 java cassandra query-optimization datastax-java-driver

我正在使用 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 和模式可以遵循?

谢谢

最佳答案

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

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

关于Java - 在 "IN"中有大量参数的 Cassandra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53853131/

相关文章:

Cassandra 与批量更新不一致

java - 在 java.util.ArrayList 或 SQL 中执行 "Optimized"set 操作

java - 如何从 Jetty AbstractHandler handle() 方法检索 POST 数据?

java - 除了必须计算的值之外还有一个附加条件的动态规划问题

java - 通过 Java Servlet 发送 XML 数据时发送不需要的字符

mysql - 以更好的方式编写此 SQL 查询的好方法是什么?

mysql - 提高删除重复项的查询性能

java - 如何关闭 TCP Keepalive?

java - 如何列出 Cassandra 列族中的所有列名?

count - 使用 Cassandra 执行 Spark 任务