13

ApacheCassandraとJavaEE6を学習するための小さなWebアプリケーションを開発しています。Cassandraのバージョンは1.1.6です。

私を怒らせるのに問題があります...私はカウンター付きのテーブルを作成しました(cqlsh v。3.0.0を使用)

CREATE TABLE test (
  author varchar PRIMARY KEY,
  tot counter
)

そして、このようにいくつかの値を入れます:

update test set tot = tot +1 where author = 'myAuthor';

列ファミリーは完全に更新されます

author   | tot
----------+-----
myAuthor |   1

ただし、この行を削除してから(同じキーで)再度更新しようとしても、何も起こりません。テーブルはこれ以上更新されておらず、理由がわかりません。キーを使用すると、それ以上使用できなくなるように思われます。datasaxドキュメント(http://www.datastax.com/docs/1.1/references/cql/cql_lexicon)で手がかりを探しましたが、解決策を見つけることができませんでした。

誰かが私を助けることができますか?少し早いですがお礼を

4

2 に答える 2

18

Cassandraには、カウンターの削除に関していくつかの厳しい制限があります。カウンターを実際に削除してから、短時間で再度使用することはできません。Cassandra wikiから:

カウンターの削除は本質的に制限されています。たとえば、「インクリメント、削除、インクリメント」というシーケンスを非常にすばやく発行すると、削除が失われる可能性があります(何らかの理由で、削除が最後に受信されたメッセージである場合)。したがって、カウンタの削除は、最終的な削除、つまり、削除されたカウンタが後でインクリメントされない場合にのみ提供されます。これは行の削除にも当てはまります。カウンターの行を削除する場合、その行のカウンター(削除前に存在していた)をインクリメントすると、動作が不確定になります。カウンターをリセットする必要がある場合、1つのオプション(残念ながら同時安全ではありません)は、その値を読み取って-valueを追加することである可能性があることに注意してください。

于 2012-12-04T01:32:35.673 に答える
2

削除されたカウンターキーを再度追加するための解決策は、テーブルからそのすべてのレコードを削除することです。

nodetool repair $table
cqlsh -c "ALTER TABLE $table WITH gc_grace_seconds=1;"
sleep 1
nodetool compact $table

ご想像のとおり、これは実際のシステムでは実用的ではなく、重要なカウンターが何らかの理由で誤って削除された場合の緊急事態に備えて予約する必要があります。

それが決して起こらないことを確実にすることはより良いです。

于 2017-01-12T10:22:50.833 に答える