Aerospike: how do I get record key?

十年热恋 提交于 2019-11-28 03:03:39

问题


Aerospike client has scanAll method for reading all rows from it's store. I use it in the folowing code:

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());
    }
});

But it is finished with NullPointerException, because userKey is null. All other fields are valid as expected. User key is the Long value, that was used for saving data:

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

All is fine, if I do single request like this:

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

What may be wrong? Why userKey is null?


回答1:


Aerospike uses key and set name to generate unique digest, So it stores only digest.

While inserting one record if you set writePolicy.sendKey = true then key will be stored as metadata of record. If one record is inserted with writePolicy.sendKey = true then only you will get key in scanCallback().

By default writePolicy.sendKey is false, so by default scanCallback() gets null as key. Thats why your key.userKey.toLong() gives NullPointerException.




回答2:


I too have faced this problem even at the time of writing we were setting the WritePolicy.sendkeys=true.

After 2-3 days debugging found that there were some issue with aerospike client version. Initially i were using 3.0.25 but after upgrading it to 3.0.35 it started working fine.



来源:https://stackoverflow.com/questions/27229399/aerospike-how-do-i-get-record-key

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!