java - Astyanax 的 EntityPersister 和 Collection 更新

标签 java cassandra astyanax

背景

Astyanax 的 Entity Persister 将实体的 map 保存在多个列中。格式为mapVariable.key

问题:

当实体中的映射已更新时,astyanax 的实体持久性不会从 cassandra 中删除已删除的键/值对

我现在使用的解决方案(糟糕的方法)

我正在删除整行,然后重新插入

更多信息

我使用 astyanax 的 Entity Persister (com.netflix.astyanax.entitystore) 在 cassandra 中保存我的 java 对象。

我注意到的是,当一个实体的 Map 被持久化为 2 个值时:testkey:testvalue & testkey2:testvalue2,下一次相同的实体的 Map 被持久化为一个值(一个键/值对已删除):testkey:testvalue,testkey2:testvalue2 未从列族中删除。

因此,作为变通方法,我需要删除整行然后重新插入。

我的插入代码:

        final EntityManager<T, String> entityManager = new DefaultEntityManager.Builder<T, String>()
            .withEntityType(clazz)
            .withKeyspace(getKeyspace())
            .withColumnFamily(columnFamily)
            .build();
    entityManager.put(entity);

我错过了什么?这真的很低效,我认为 astyanax 的实体持久化器应该自己处理这个问题。

有什么想法吗?

最佳答案

你没有遗漏任何东西。

接下来会发生什么: 1. Astyanax 为序列化实体的每个字段创建一个 ColumnMappers 列表。 2. 然后,ColumnMappers 轮流填充突变批处理。 3. 对于 map ,MapColumnMapper用来。如果你看一下它的代码,你会发现它只是将键值对添加到突变批处理中。 4. 当数据在 cassandra 中连续放置时,批处理中的新列被添加,现有列被覆盖,不幸的是旧列保持不变

此处的一种解决方案是为您的 map 编写自定义序列化程序并将其保存在一个字段中。

关于java - Astyanax 的 EntityPersister 和 Collection 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674363/

相关文章:

Cassandra 客户端未显示通过 json2sstable 所做的更改

java - Astyanax 不遵守配置的套接字超时

cassandra - 如何使用 astyanax 从 cassandra CF 读取所有 1000 行

java - 如何使用蓝牙 getInputStream 和 getOutputStream 的 pyjnius 读写参数?

java - 获取在android中使用wifi网络共享连接的所有用户的列表

Java反射;如何使用 Method.invoke() 检索对象数组?

java - 当新的应用程序实例启动时,如何将数据传递给已经运行的应用程序实例

scala - 在 Cassandra 上运行的 Spark 由于 ClassNotFoundException : com. datastax.spark.connector.rdd.partitioner.CassandraPartition 而失败(详情见内部)

docker - 无法在 Mac 上启动 2 个 cassandra 容器

cassandra - Thrift API 和 CQL 之间的混淆