6

バックグラウンド

Astyanax の Entity Persister は、エンティティのマップを複数の列に保存します。形式は mapVariable.key です。

問題:

astyanax の Entity Persister は、エンティティ内のマップが更新されたときに、削除されたキーと値のペアを cassandra から削除しません。

私が現在使用しているソリューション(悪いアプローチ)

行全体を削除してから再挿入します

追加情報

astyanax の Entity Persister (com.netflix.astyanax.entitystore) を使用して、cassandra で Java オブジェクトを永続化します。

私が気付いたのは、エンティティのマップがたとえば2つの値で永続化されている場合: testkey:testvalue & testkey2:testvalue2、および次回同じエンティティのマップが1つの値で永続化される(1つのキーと値のペアが削除された) : 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 のエンティティ永続化機能がこれを独自に処理することになっていると思います。

何かご意見は?

4

2 に答える 2

2

あなたは何も見逃していません。

1. Astyanax は、シリアライゼーション中のエンティティのフィールドごとに 1 つの ColumnMappers のリストを作成します。2. 次に、ColumnMappers が交代でミューテーション バッチにデータを入力します。3. マップの場合、MapColumnMapperが使用されます。そのコードを見ると、キーと値のペアをミューテーション バッチに追加しているだけであることがわかります。4. データが cassandra の行に配置されると、バッチからの新しい列が追加され、既存の列は上書きされますが、古い列は残念ながら同じままです。

ここでの 1 つの解決策は、マップのカスタム シリアライザーを作成し、それを 1 つのフィールドに保存することです。

于 2013-09-03T17:21:29.617 に答える
1

https://github.com/deanhiller/playorm cassandra、hbase、その他のいくつかの nosql データベース用の orm マッパーをご覧ください。保存時にコレクションからアイテムを削除します。astyanaxよりも使いやすいです。

于 2013-08-19T19:21:53.743 に答える