【问题标题】:Aerospike: how do I get record key?Aerospike:我如何获得记录密钥?
【发布时间】:2015-01-29 12:25:43
【问题描述】:

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

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

一切都很好,如果我像这样提出单个请求:

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

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

【问题讨论】:

    标签: java aerospike nosql


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        相关资源
        最近更新 更多