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 为空。所有其他字段都按预期有效。用户键是 Long 值,用于保存数据:

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

一切都很好,如果我做这样的单一请求:

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

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

4

2 回答 2

17

Aerospike 使用 key 和 set name 来生成唯一的摘要,因此它只存储摘要。

如果您设置writePolicy.sendKey = true,则插入一条记录时,键将存储为记录的元数据。如果插入一条记录,writePolicy.sendKey = true那么只有您将在 scanCallback() 中获得密钥。

默认 writePolicy.sendKey 为 false,因此默认scanCallback()获取null作为键。这就是你key.userKey.toLong()给出NullPointerException的原因。

于 2014-12-01T16:44:54.713 回答
3

即使在撰写本文时,我也遇到了这个问题,我们正在设置 WritePolicy.sendkeys=true。

经过2-3天调试发现aerospike客户端版本有问题。最初我使用的是 3.0.25,但升级到 3.0.35 后它开始正常工作。

于 2015-05-20T05:55:09.380 回答