使用datatax java驱动程序2.0的多线程

cotxawn7  于 2022-09-27  发布在  Java
关注(0)|答案(3)|浏览(130)

我的数据模型基于时间序列(在cassandra CFs中插入来自不同来源的提要)。有人能建议如何在多线程中进行插入吗。?使用executeAsync方法执行查询类似于多线程吗?Cassandra有什么财产吗。要实现多线程,我需要设置哪个yaml?或任何其他先决条件。

lpwwtiir

lpwwtiir1#

该驱动程序对于多线程使用是安全的。您通常要做的是构建Cluster并在应用程序启动期间获取Session示例,然后在所有线程之间共享Session
如何处理多线程取决于您的代码。我也不知道SQS,但我想您可能会有多个消费者从队列轮询并自己处理消息,或者可能会将消息发送给一个工作线程池。
关于executeAsync,返回的ResultSetFuture实现了Guava的e1b5d1e,因此您可以使用addListener注册成功回调。但您必须提供一个Executor来运行该回调(我不推荐Javadoc中提到的MoreExecutors#sameThreadExecutor,因为您的回调最终会在驱动程序的一个I/O线程上运行)。
正如Carlo所提到的,一个简单的方法是使用同步execute,并让您的worker阻塞,直到它收到来自Cassandra的响应,然后确认消息。

h79rfbju

h79rfbju2#

executeAsync()为语句的执行创建了一个单独的线程,并立即将控件返回给调用者——e1d1e将得到您的结果。使用此方法时,在进入Future之前,您不会知道是否发生任何异常。
在Cassandra,你不需要设置任何东西。只需控制应用程序中的线程数,并正确初始化Java驱动程序,以提供符合您需要的PoolingOptions对象。
HTH,卡罗

g2ieeal7

g2ieeal73#

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

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

这将等待查询提交,不会占用内存。

相关问题