2016-11-10 3 views
1

ich eine Tabelle mit Zählerspalte in com.datastax.driver.core Pakete verwenden, und eine Funktion in der Klasse:Wie wird der Datensatz mit der Zählerspalte zurückgesetzt, nachdem er in Cassandra gelöscht wurde?

public void doStartingJob(){ 
    session.execute("CREATE KEYSPACE myks WITH replication " 
      + "= {'class':'SimpleStrategy', 'replication_factor':1};"); 
    session.execute("CREATE TABLE myks.clients_count(ip_address text PRIMARY KEY," 
             + "request_count counter);"); 
} 

Nach diesem I gelöscht Tabelleneintrag von CQLSH wie:

[email protected]:~$ cqlsh 
Connected to Test Cluster at 127.0.0.1:9042. 
[cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Native protocol v4] 
Use HELP for help. 

cqlsh:myks> DELETE FROM clients_count WHERE ip_address='127.0.0.1'; 

Dann Zeile mit demselben Primärschlüssel einzufügen I folgende Erklärung verwendet (via cqlsh):

UPDATE myks.clients_count SET request_count = 1 WHERE ip_address ='127.0.0.1'; 

Und es ist nicht erlaubt als:

InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot set the value of counter column request_count (counters can only be incremented/decremented, not set)" 

Aber, ich möchte den Wert von Zählerspalte Rekord sollte auf 1, und mit dem gleichen Primärschlüssel festgelegt werden. (Funktionale Anforderung)

Wie das gleiche ??

Antwort

2

Die Verwendung von Zählern ist ein bisschen seltsam, aber Sie werden sich daran gewöhnen. Die Hauptsache ist jedoch, dass Zähler nicht wiederverwendet werden können. Sobald Sie einen Zählerwert für einen bestimmten Primärschlüssel löschen, ist dieser Zähler für immer verloren. Dies ist von Entwurf und ich denke, wird sich nicht ändern.

Zurück zu Ihrer Frage, das erste Ihrer Probleme ist die erste DELETE. Nicht.

Zweitens, wenn der Zählerwert für einen Primärschlüssel nicht existiert, C * wird behandelt es ist null standardmäßig. Nach the documentation, zum Laden von Daten in den Zähler zum ersten Mal, wenn Sie Problem haben:

UPDATE mysecurity.clients_count SET request_count = request_count + 1 WHERE ip_address ='127.0.0.1'; 

Und ein SELECT wird wieder die richtige Antwort: 1

Auch hier passen sie von Löschungen! Nicht! Wenn Sie das tun, jede nachfolgende Abfrage:

UPDATE mysecurity.clients_count SET request_count = request_count + 1 WHERE ip_address ='127.0.0.1'; 

wird NICHT scheitern, aber der Zähler NICHT aktualisiert werden.

andere Sache zu beachten ist, dass C * nicht unterstützen Atom Lese- und aktualisieren (oder Update und auf Zähler Spalten lesen. Das heißt, Sie kein Update ausstellen kann und innerhalb derselben Abfrage erhalten die neue (oder Der alte Wert des Zählers: Sie müssen zwei verschiedene Abfragen ausführen, eine mit SELECT und eine mit UPDATE, aber in einer Multi-Client-Umgebung konnte der SELECT Wert, den Sie erhalten, nicht den Zählerwert während der UPDATE.

widerspiegeln

Ihre App wird definitiv fehlschlagen, wenn Sie dies unterbewerten

+0

nach DELETE nach den UPDATE-Myks.clients_count SET request_count = 1 WHERE IP_Adresse = '127.0.0.1'; wenn ich über UPDATE neu aktualisiere myks.clients_count SET request_count = request_count +1 WHERE ip_address = '127.0.0.1'; Es funktioniert und aktualisiert den Zähler mit dem Wert, den ich gelöscht habe. –

+0

Thankyou @ xmas79 –

+0

** Counter-Datensatz wird nie gelöscht ** Siehe [THIS.] (Http://stackoverflow.com/a/13694777/7081346) –

Verwandte Themen