[英]Is a cassandra session thread safe? (using cpp driver)
我正在開發一個多線程應用程序並使用 Cassandra 作為后端。
早些時候,我為每個子線程創建了一個單獨的會話,並在執行后殺死線程之前關閉會話。 但后來我認為這可能是一項昂貴的工作,所以我現在設計它,我在服務器啟動時打開了一個會話,任何數量的客戶端都可以使用該會話進行查詢。
問題:我只想知道這是否正確,或者有更好的方法嗎? 我知道連接池是一種選擇,但是在這種情況下真的需要嗎?
它在 Java 驅動程序中當然是線程安全的,所以我假設 C++ 驅動程序是相同的。
鼓勵您只創建一個會話並讓所有線程使用它,以便驅動程序可以有效地維護到集群的連接池並異步處理來自客戶端線程的命令。
如果您在一台客戶端機器上創建多個會話或不斷打開和關閉會話,您將迫使驅動程序不斷建立和斷開與集群的連接,這會浪費資源。
引用這篇 Datastax 博客文章,了解使用 Cassandra 的 DataStax 驅動程序時的 4 個簡單規則:
- 每個(物理)集群(每個應用程序生命周期)使用一個集群實例
- 每個鍵空間最多使用一個會話,或者使用單個會話並在查詢中明確指定鍵空間
- 如果您多次執行一條語句,請考慮使用 PreparedStatement
- 您可以通過使用批處理來減少網絡往返次數並進行原子操作
C/C++ 驅動程序在會話和未來級別絕對是線程安全的。
CassSession 對象用於查詢執行。 在內部,會話對象還管理與 Cassandra 的客戶端連接池,並使用負載平衡策略在這些連接之間分配請求。 應用程序應該為每個鍵空間創建一個會話對象,因為會話對象被設計為一次創建、重用和由應用程序內的多個線程共享。
他們實際上有一個名為Thread Safety的部分:
CassSession 旨在從多個線程並發使用。 CassFuture 也是線程安全的。 除了這些排除之外,一般來說,可能修改對象狀態的函數不是線程安全的。 不可變對象(標記為“const”)可以被多個線程安全讀取。
他們還有關於釋放對象的說明。 那不是線程安全的。 因此,在釋放對象之前,您必須確保所有線程都已完成:
注意:對象/資源釋放函數(例如 cass_cluster_free、cass_session_free、... cass_*_free)不能在對象的同一實例上同時調用。
來源:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.