java 的 DSE cassandra 驱动程序在异步模式下仅返回部分结果
DSE cassandra driver for java returning only partial results in async mode
使用 java 的 dse cassandra 驱动程序 3.1.4 从 cassandra 获取数据时,我只获得了部分行集。
此查询也适用于我们使用的早期版本的驱动程序。
较早的版本是 2.1.9
Table结构是这样的
Key column1 value
CM~020 000001000 20
CM~010 000001000 10
当我使用异步调用查询多行时,大多数时候我只得到一行。有时在调试时我也会得到另一行。
行为是随机的,但我总是得到第二行或两者。我从来没有只得到第一行,所以我认为这在这里也有一定的作用。
for (Object partitionKey : partitionKeys) {
paramArray[0] = partitionKey;
futures.add(session.executeAsync(boundStatement.bind(paramArray)));
}
有没有办法确保我每次都能获得所有行?
这里最明显的是你有竞争条件 - 我看到你正在重复使用相同的数组对象来指定参数,并且从你的源代码看起来你正在使用相同的 BoundStatement
实例,所以你正在覆盖请求数据...
我建议修改您的代码以使用 preparedStatement.bind(paramArray)
而不是 boundStatement.bind(paramArray)
-> 它会创建新的 BoundStatement
实例。
P.S。如果它之前确实有效,那么这只是巧合...
使用 java 的 dse cassandra 驱动程序 3.1.4 从 cassandra 获取数据时,我只获得了部分行集。 此查询也适用于我们使用的早期版本的驱动程序。 较早的版本是 2.1.9
Table结构是这样的
Key column1 value CM~020 000001000 20 CM~010 000001000 10
当我使用异步调用查询多行时,大多数时候我只得到一行。有时在调试时我也会得到另一行。
行为是随机的,但我总是得到第二行或两者。我从来没有只得到第一行,所以我认为这在这里也有一定的作用。
for (Object partitionKey : partitionKeys) {
paramArray[0] = partitionKey;
futures.add(session.executeAsync(boundStatement.bind(paramArray)));
}
有没有办法确保我每次都能获得所有行?
这里最明显的是你有竞争条件 - 我看到你正在重复使用相同的数组对象来指定参数,并且从你的源代码看起来你正在使用相同的 BoundStatement
实例,所以你正在覆盖请求数据...
我建议修改您的代码以使用 preparedStatement.bind(paramArray)
而不是 boundStatement.bind(paramArray)
-> 它会创建新的 BoundStatement
实例。
P.S。如果它之前确实有效,那么这只是巧合...