[英]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.