2016-11-28 33 views
1

我正在Java中使用Cassandra一段時間,發現我們可以限制結果集的大小,並通過從應用程序端存儲分頁狀態,我們可以在同一語句中重用該頁面狀態以從最後一條記錄中獲取數據的迴應。例如,Cassandra中是否存在PagingState的超時期限?

ResultSet resultSet = session.execute("your query"); 
PagingState pagingState = resultSet.getExecutionInfo().getPagingState(); 

我們可以使用此pagingState變量來獲取下一批記錄(基於獲取大小設置),如下所示。

Statement st = new SimpleStatement("your query"); 
st.setPagingState(pagingState); 
ResultSet rs = session.execute(st); 

這意味着卡桑德拉存儲鏈接到它的索引數據與尋呼狀態。我想了解是否存在任何超時期限,直到頁面狀態保留在cassandra數據庫中,或者它保持鏈接(分頁狀態)直到會話關閉。我已經通過Cassandra的官方文檔,仍然找不到任何。

回答

4

幸運的是,沒有與分頁狀態相關的超時,只有一個小警告。由於版本之間可能會發生變化,因此內部分頁狀態會保留查詢文本的MD5,頁面大小,使用的協議版本以及對錶示最後一行讀取的集羣密鑰的引用(如果查詢跨越分區,也是分區鍵)。

但是,它不能保證傳呼狀態會穿過協議版本工作,因爲在java driver manual for paging描述:

由於內部實施細則,PagingState情況下,不能跨本地協議版本便攜。這可能會成爲在以下情況下的問題:

  • 您使用驅動程序2.0.x和Cassandra 2.0.x,因此本機協議v2;
  • 用戶爲包含序列化尋呼狀態的Web服務的書籤添加書籤;
  • 您升級服務器堆棧以使用驅動程序2.1.x和Cassandra 2.1.x,因此您現在使用的是協議v3;
  • 用戶嘗試重新加載其書籤,但分頁狀態已使用協議v2序列化,因此嘗試重新使用它將失敗。
+1

感謝您的回覆。所以,如果會話沒有關閉,分頁狀態信息將永遠保留在數據庫中? – AV94

+1

所有的狀態都在PagingState數據本身中。 Cassandra沒有爲分頁保留任何狀態,所以Session可以關閉,PagingState仍然可以使用。這就是爲什麼它可以永久重複使用(使用相同的協議版本),以及爲什麼當您查詢以前從未看過該查詢的C *節點時,它仍然能夠知道從哪裏尋呼。 I.E.如果您查詢節點A並返回一個分頁狀態,那麼如果您使用該分頁狀態將查詢發送到節點B,它仍然可以工作,因爲所有狀態都包含在分頁狀態中。 –

相關問題