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为null?
答案 0 :(得分:16)
Aerospike使用密钥和集合名称生成唯一摘要,因此它仅存储摘要。
如果设置writePolicy.sendKey = true
,则在插入一条记录时,密钥将被存储为记录的元数据。
如果使用writePolicy.sendKey = true
插入一条记录,那么只有您将获得scanCallback()中的密钥。
默认情况下,writePolicy.sendKey为false,因此默认情况下scanCallback()
将 null 作为键。这就是为什么你的key.userKey.toLong()
给出 NullPointerException 。
答案 1 :(得分:3)
即使在撰写本文时我也设置了WritePolicy.sendkeys = true,我也遇到过这个问题。
经过2-3天的调试,发现airospike客户端版本存在一些问题。最初我使用的是3.0.25,但在将其升级到3.0.35后,它开始正常工作。