2014-12-01 8 views
10

Aerospike 클라이언트는 scanAll 방법을 사용하여 상점에서 모든 행을 읽습니다.Aerospike : 레코드 키를 얻으려면 어떻게해야합니까?

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

을하지만 userKey가 null이기 때문에이 NullPointerException로 마감 : 나는 folowing 코드를 사용합니다. 다른 모든 필드는 예상대로 유효합니다. 사용자 키는이 데이터를 저장하기 위해 사용되었다, 긴 값입니다

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

이 같은 단일 요청 할 경우 모든 괜찮 :

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

것은 무엇 잘못 될 수 있습니까? userKey가 null 인 이유는 무엇입니까?

답변

15

Aerospike는 고유 한 다이제스트를 생성하기 위해 키와 세트 이름을 사용하므로 다이제스트 만 저장합니다.

writePolicy.sendKey = true을 설정하면 하나의 레코드를 삽입하는 동안 키가 레코드의 메타 데이터로 저장됩니다. 하나의 레코드가 writePolicy.sendKey = true으로 삽입되면 scanCallback()에 키만 가져옵니다.

기본적으로 writePolicy.sendKey는 false이므로 scanCallback()null을 키로 사용합니다. 그 이유는 key.userKey.toLong()입니다. NullPointerException입니다.

+1

시간과 좋은 답변에 감사드립니다. – DmitryKanunnikoff

3

필자도 WritePolicy.sendkeys = true로 설정 한 경우에도이 문제에 직면했습니다.

2 ~ 3 일 후 디버깅을하면 aerospike 클라이언트 버전에 문제가 있음을 발견했습니다. 처음에는 3.0.25를 사용했지만 3.0.35로 업그레이드 한 후 제대로 작동하기 시작했습니다.