Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据存储到aerospike中_Java_Database_Aerospike - Fatal编程技术网

Java 将数据存储到aerospike中

Java 将数据存储到aerospike中,java,database,aerospike,Java,Database,Aerospike,我有一些数据要存储到aerospike的一列中 假设输入数据为 ["A", 1] 现在第一个问题是如何用Java保存这些数据 我试过这个 ArrayList value = new ArrayList(); value.add(new String("A")); value.add(new Integer(2)); 当我尝试使用 AerospikeClient client = client.put(new WritePolicy(),

我有一些数据要存储到aerospike的一列中

假设输入数据为

["A", 1]
现在第一个问题是如何用Java保存这些数据

我试过这个

ArrayList value = new ArrayList();
value.add(new String("A"));
value.add(new Integer(2));
当我尝试使用

AerospikeClient client = client.put(new WritePolicy(), 
         new Key("namespace", "set", "test"), 
         new Bin("binName", value) );
AerospikeClient client = client.put(new WritePolicy(), 
         new Key("namespace", "set", "test"), 
         new Bin("binName", Value.getAsList(value)) );
如果我使用AQL来查询,那么我看到了

|AC ED 00 05 73 72 00 13 6A 61 76 61 2 E 75 74 69 6C 2 E 41 72 72 61 79 4C 69 73 74 78 81 D2 1D 99 C7 61 9D 03 00 01 49 00 04 73 69 7A 65 78 00 00 02 77 04 00 02 73 00 11 6A 61 76 61 2 E 6C 61 6E 67 2 E 49 6 E 74 65 72 12 E2 A0 A4 F7 81 87|

一些十六进制数

但是当我尝试使用

AerospikeClient client = client.put(new WritePolicy(), 
         new Key("namespace", "set", "test"), 
         new Bin("binName", value) );
AerospikeClient client = client.put(new WritePolicy(), 
         new Key("namespace", "set", "test"), 
         new Bin("binName", Value.getAsList(value)) );
然后通过AQL启动查询给我

[“A”,1]

这是而且似乎是预期的行为,但当我使用Aerospike客户端获取值并检查其类型时

List<Object> ret = (List<Object>) client.get(new Policy(), key, "test").getValue("binName");

    if(ret.get(0) instanceof Long){
        System.out.println("Got instance of long");
    }
PS:请用小代码snippit支持您的答案

在GITHUB上找到了一些信息

在参考链接中有一些功能

我正在下面复制/粘贴它

/**
 * Write/Read ArrayList<Object> directly instead of relying on java serializer.
 */
private void testListComplex(AerospikeClient client, Parameters params) throws Exception {
    console.info("Read/Write ArrayList<Object>");
    Key key = new Key(params.namespace, params.set, "listkey2");
    client.delete(params.writePolicy, key);

    byte[] blob = new byte[] {3, 52, 125};      
    ArrayList<Object> list = new ArrayList<Object>();
    list.add("string1");
    list.add(2);
    list.add(blob);

    Bin bin = new Bin(params.getBinName("listbin2"), list);
    client.put(params.writePolicy, key, bin);

    Record record = client.get(params.policy, key, bin.name);
    List<?> receivedList = (List<?>) record.getValue(bin.name);

    validateSize(3, receivedList.size());
    validate("string1", receivedList.get(0));
    // Server convert numbers to long, so must expect long.
    validate(2L, receivedList.get(1)); 
    validate(blob, (byte[])receivedList.get(2));
    
    console.info("Read/Write ArrayList<Object> successful.");
}
/**
*直接写入/读取ArrayList,而不是依赖java序列化程序。
*/
私有void testListComplex(AerospikeClient客户端,参数参数)引发异常{
console.info(“读/写数组列表”);
Key Key=newkey(params.namespace,params.set,“listkey2”);
client.delete(params.writePolicy,key);
byte[]blob=新字节[]{3,52,125};
ArrayList=新建ArrayList();
列表。添加(“string1”);
增加(2);
列表。添加(blob);
Bin Bin=新Bin(参数getBinName(“listbin2”),列表);
client.put(参数writePolicy、key、bin);
Record=client.get(params.policy、key、bin.name);
List receivedList=(List)record.getValue(bin.name);
validateSize(3,receivedList.size());
验证(“string1”,receivedList.get(0));
//服务器将数字转换为long,因此必须预期long。
验证(2L,receivedList.get(1));
验证(blob,(字节[])receivedList.get(2));
info(“读/写数组列表成功”);
}
有一条注释,服务器将数字转换为长

现在我有一个问题。那么这是否意味着对于这种类型的情况,不能存储整数?

如果您检查,您将看到它们只支持64位整数,在Java中是
类型

如果不需要通过Lua UDF脚本访问服务器上的这些数据,那么可以将其保存为序列化的blob数据。java驱动程序已经支持本机序列化,这是您在第一次尝试中所做的。AQL只是向您显示序列化的字节,但是您可以在java客户机中很好地读回它

或者,您可以将其存储为json序列化字符串,以便与将来可能使用的其他语言驱动程序更兼容。

任何(即,应用程序端的类型不直接映射到Aerospike服务器类型)都将被序列化并存储在服务器上的as_字节类型中。在本例中,它有一个声明,说明它是由Java客户机序列化的(作为\u字节\u Java)。