2016-09-15 44 views
0

我已經在cassandra DB中使用Java Class我正在檢索每一行,使用TTL進行更新並將它們存儲回Cassandra DB。之後如果我運行select查詢它的執行和顯示記錄。但是當TTL時間完成後,如果我運行select查詢,它必須顯示零記錄,但它沒有運行select查詢顯示Cassandra Failure during read query at consistency ONE錯誤。對於其他表select查詢正常工作,但對於該表(應用TTL的行)不起作用。無法在cassandra中設置TTL之後運行選擇查詢

+0

請發佈您的表架構和您的查詢。 – xmas79

+0

我正在使用Java獲取記錄並修改..我已經編輯了表格和Java代碼的帖子...... – Sat

回答

1

您正在使用常見的反模式。

1)您正在使用批次將數據分別加載到兩個單獨的表中。我不知道你是否已經擁有一個羣集,或者你是在本地機器上,但這不是你將數據加載到C *羣集的方式,而且你要強調很多你的C *羣集。只有當您需要保持兩個或更多表同步時,才應使用批處理,並且不要在時間加載一堆記錄。我建議你閱讀下面的話題:

2)您使用的同步寫入插入你的漂亮indipendent記錄到您的集羣。您應該使用異步寫入來加速您的數據處理。

3)您使用的是TTL功能在你的表,這本身是沒有那麼糟糕。然而,一個已過期 TTL 一個墓碑,這意味着當你的查詢C *將不得不閱讀所有這些墓碑。

4)你綁定你準備好的聲明中多個時間:

BoundStatement bound = phonePrepared.bind(macAddress, ... 

這應該是

BoundStatement bound = new BoundStatement(phonePrepared).bind(macAddress, ... 

爲了使用不同綁定語句。這不是反模式,這是你的代碼有問題。

現在,如果您多次運行程序,由於TTL功能,表格中有很多墓碑,這意味着C *正在努力閱讀所有這些內容,以便查找您上次寫入的內容「你成功運行了,並且查詢超時需要很長時間。

只是爲了好玩,你可以嘗試增加您的超時,說2分鐘,在SELECT並採取咖啡,並在此期間C *會得到你的記錄了。

我不知道你在努力達到什麼,但是快速TTLs是你的敵人。如果你只是想刷新你的記錄,然後儘量保持TTL時間足夠高,以便它不會傷害你的表演。或者,一個可能更好的解決方案是添加一個新的列EXPIRED,「手動」寫入,只有當你需要刪除一條記錄時。這取決於你的要求。