使用datastax java驱动程序2.0进行多线程处理

时间:2014-07-28 06:33:24

标签: java multithreading datastax datastax-java-driver

我的数据模型基于时间序列(在cassandra CF中插入来自各种来源的提要。)任何人都可以建议如何在多线程中进行插入。是否使用类似于多线程的executeAsync方法执行查询?我需要设置cassandra.yaml的任何属性来实现多线程吗?或任何其他先决条件。

3 个答案:

答案 0 :(得分:4)

驱动程序对于多线程使用是安全的。您通常要做的是在应用程序启动期间构建您的Cluster并获取Session实例,然后在所有线程中共享Session

如何处理多线程特定于您的代码。我也不知道SQS,但我想你要么有多个消费者从队列中进行轮询并自己处理消息,要么将消息发送给工作人员池。

关于executeAsync,返回的ResultSetFuture实现了Guava的ListenableFuture,因此您可以使用addListener注册成功回调。但是你必须提供一个Executor来运行该回调(我不推荐Javadoc中提到的MoreExecutors#sameThreadExecutor,因为你的回调最终会在其中一个驱动程序的I / O上运行线程)。

正如Carlo所提到的,一个简单的方法是使用同步execute,并让你的工作程序阻塞,直到它从Cassandra得到响应,然后确认该消息。

答案 1 :(得分:2)

executeAsync()为执行语句创建一个单独的线程,并立即将控件返回给调用者 - Future<ResultSet>将得到您的结果。使用这种方法时,您不会知道是否发生了任何异常,直到您进入Future

在卡珊德拉,你不必设置任何东西。只需控制应用程序中的线程编号,并正确初始化Java驱动程序,提供符合您需求的PoolingOptions对象。

HTH,Carlo

答案 2 :(得分:1)

如果在多线程环境中执行查询,请确保等待executeAsync(语句)完成, session.executeAsync(statement)将立即返回,它不保证查询是有效还是成功提交。因此,如果您正在使用线程池,那么请始终使用

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

这将等待提交查询,不会消耗内存。

相关问题