气溶胶数据库:如何获取记录键?

12

Aerospike客户端有一个scanAll方法,用于从其存储中读取所有行。

我在以下代码中使用它:

ScanPolicy policy = new ScanPolicy();
policy.concurrentNodes = true;
policy.priority = Priority.DEFAULT;
policy.includeBinData = true;
policy.scanPercent = 100;

client.scanAll(policy, "namespaceName", "setName", new ScanCallback() {
    @Override
    public void scanCallback(Key key, Record record) throws AerospikeException {
        STORE.put(key.userKey.toLong(), record.getValue("binName").toString());
    }
});

但是出现了NullPointerException,因为userKey是null。所有其他字段都符合预期并且有效。用户键是Long值,用于保存数据:

client.put(writePolicy, new Key("namespaceName", "setName", userKey), new Bin("binName", value));

如果我像这样发起单个请求,一切都很正常:

client.get(readPolicy, new Key("namespaceName", "setName", userKey));

可能有什么问题?为什么userKey为空?

2个回答

17
Aerospike使用键和集合名称生成唯一摘要,因此仅存储摘要。
如果您设置了writePolicy.sendKey=true,则在插入一条记录时,键将存储为记录的元数据。只有使用writePolicy.sendKey=true插入一条记录时,才会在scanCallback()中获得键。
默认情况下,writePolicy.sendKey为false,因此默认情况下scanCallback()获取null作为键。这就是为什么key.userKey.toLong()会导致NullPointerException的原因。

3

我也曾经遇到过这个问题。我们当时设定了WritePolicy.sendkeys=true,但仍然遇到了问题。

后来花了2-3天的时间进行调试,发现是aerospike客户端版本的问题。最初我使用的是3.0.25,但升级到3.0.35后就正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接