繁体   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