Cassandra查询在第一个查询时返回空数组,但在后续查询中返回非空数组

时间:2015-08-05 20:38:20

标签: database node.js asynchronous cassandra

我正在尝试使用Node.js Cassandra驱动程序对Cassandra集群进行简单查询。我正在关注这些示例,但即使返回的集合中没有结果,似乎我的回调函数也会被调用。

var q = function (param) {
    var query = 'SELECT * FROM my_table WHERE my_col=?';
    var params = [param];

    console.log("Cassandra query is being called with parameters " + params);

    client.execute(query, params, function (err, result) {
        console.log("Cassandra callback is being called. Row count is " + result.rows.length);

        if (err != null) {
            console.log("Got error");
        }

        if (result.rows.length <= 0) {
            console.log("Sending empty response.");
        }
        else {
            console.log("Sending non-empty response.");
        }
    });
};

q('value');
q('value');

输出

Cassandra query is being called with parameters value
Cassandra query is being called with parameters value
Cassandra callback is being called. Row count is 0
Sending empty response.
Cassandra callback is being called. Row count is 1
Sending non-empty response.

这种情况相当一致,但有时两次调用都会变空,有时两次调用都会返回值。

我想我这里的异步调用有问题,但我不确定它是什么。

2 个答案:

答案 0 :(得分:1)

我认为这是由于群集中的节点错误造成的。其中一个节点缺少一堆数据,所以有三分之一的时间我没有得到任何结果。

答案 1 :(得分:0)

当您打开连接时,是否发送了consistency命令?

当我打开一个连接电话execute并发送use <keyspace>;后跟consistency local_quorum;时,我也遇到了这个问题。这告诉Cassandra看起来有点难以回答,并同意其他节点,你得到的是最新版本。

注意:我保持连接一段时间,所以这并没有增加任何有意义的开销(对我来说)。

注意2:以上似乎不再适用于我的python应用程序(使用Cassandra 3.5)。但是,在调用SimpleStatement之前使用consistency并设置execute会:https://datastax.github.io/python-driver/getting_started.html#setting-a-consistency-level

我希望这会有所帮助。