簡體   English   中英

使用Datastax Java驅動程序2.0的多線程

[英]Multi Threading with datastax java driver 2.0

我的數據模型基於時間序列(在Cassandra CF中插入來自各種來源的提要。)有人可以建議如何在多線程中進行插入嗎? 使用executeAsync方法執行查詢是否類似於多線程? 是否需要設置cassandra.yaml的任何屬性才能實現多線程? 或任何其他先決條件。

該驅動程序可安全用於多線程。 通常,您要做的是構建Cluster並在應用程序啟動期間獲取一個Session實例,然后在所有線程之間共享Session

處理多線程的方式特定於您的代碼。 我也不知道SQS,但我想您要么有多個使用者從隊列中輪詢並自己處理消息,要么將消息分發給工作人員池。

關於executeAsync ,返回的ResultSetFuture實現了Guava的ListenableFuture ,因此您可以向addListener注冊成功回調。 但是您必須提供一個Executor才能在其上運行該回調(我不建議像Javadoc中所建議的MoreExecutors#sameThreadExecutor使用MoreExecutors#sameThreadExecutor ,因為您的回調最終將在驅動程序的I / O線程中運行)。

正如Carlo所提到的,一種簡單的方法是使用同步execute ,並讓您的worker阻塞,直到它得到Cassandra的響應,然后確認該消息。

executeAsync()創建一個單獨的線程來執行該語句,並立即將控件返回給調用者Future<ResultSet>將得到您的結果。 使用這種方法時,直到您進入Future您都不會知道是否發生任何異常。

在Cassandra中,您無需進行任何設置。 只需控制應用程序中的線程號並正確初始化Java驅動程序即可提供符合您需求的PoolingOptions對象。

HTH,Carlo

如果要在多線程環境中執行查詢,請確保等待執行executeAsync(statement),session.executeAsync(statement)將立即返回,它不能保證查詢是否有效或提交成功。 因此,如果您使用的是線程池,則始終使用

ResultSetFuture future = session.executeAsync(statement);
future.getUninterruptibly();

這將等待查詢提交,並且不會消耗內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM