阻止來自com.datastax.driver.core.Session這種方法卡桑德拉如何處理阻斷datastax Java驅動程序
public ResultSet execute(Statement statement);
評論執行fethod執行語句:
此方法一直阻塞至少從 數據庫收到了一些結果。但是,對於SELECT查詢,它並不保證 結果已被完整接收。但它確實保證從數據庫接收到一些 響應,特別是 保證如果請求無效,則通過此方法將拋出異常 。
非阻塞從com.datastax.driver.core.Session
public ResultSetFuture executeAsync(Statement statement);
此方法不會阻止執行fethod。只要查詢已經傳送到底層網絡堆棧,它就會返回 。特別是,從 返回時,此方法不保證查詢有效或甚至已將 提交給活動節點。在訪問{@link ResultSetFuture}時,任何與查詢失敗 有關的異常都將被拋出。
我有關於他們的02個問題,因此,如果你能幫助我理解他們,那將是非常好的。
比方說,我有100萬條記錄,我希望所有這些記錄都到達數據庫(沒有丟失)。
問題1:如果我有線程數爲n,所有的線程將有他們需要發送到數據庫中記錄的相同金額。他們都使用阻止執行調用繼續向cassandra發送多個插入查詢。如果我增加n的值,它是否也有助於加快我需要將所有記錄插入cassandra的時間?
這會導致cassandra性能問題嗎? Cassandra是否必須確保對於每個插入記錄,羣集中的所有節點都應該立即知道新記錄?爲了保持數據的一致性。 (我假設cassandra節點甚至不會考慮使用本地機器時間來控制記錄插入時間)。
問題2:使用非阻塞執行,我如何確保所有的插入操作都成功?我知道的唯一方法是等待ResultSetFuture檢查插入查詢的執行情況。有沒有更好的辦法可以做到?非阻塞執行更容易失敗,然後阻止執行嗎?
非常感謝您的幫助。
我沒有在'nodes * native_transport_max_threads'位上出售。特別是,推理(沒有太多的價值排隊更多的請求比卡桑德拉將一次處理)假設旅行時間是即時/微不足道。如果我的客戶端和cassandra節點之間的單程時間爲100ms,並且服務器可以在2ms內處理請求,那麼我希望一次將電線放在〜50。這裏的想法是,我現在連線的人會在大約100ms內到達,在那段時間內,服務器可以處理大約50條消息,並且我想讓服務器保持繁忙狀態,並始終確保它已經工作 –