我的数据模型基于时间序列(在cassandra CFs中插入来自不同来源的提要)。有人能建议如何在多线程中进行插入吗。?使用executeAsync方法执行查询类似于多线程吗?Cassandra有什么财产吗。要实现多线程,我需要设置哪个yaml?或任何其他先决条件。
lpwwtiir1#
该驱动程序对于多线程使用是安全的。您通常要做的是构建Cluster并在应用程序启动期间获取Session示例,然后在所有线程之间共享Session。如何处理多线程取决于您的代码。我也不知道SQS,但我想您可能会有多个消费者从队列轮询并自己处理消息,或者可能会将消息发送给一个工作线程池。关于executeAsync,返回的ResultSetFuture实现了Guava的e1b5d1e,因此您可以使用addListener注册成功回调。但您必须提供一个Executor来运行该回调(我不推荐Javadoc中提到的MoreExecutors#sameThreadExecutor,因为您的回调最终会在驱动程序的一个I/O线程上运行)。正如Carlo所提到的,一个简单的方法是使用同步execute,并让您的worker阻塞,直到它收到来自Cassandra的响应,然后确认消息。
Cluster
Session
executeAsync
ResultSetFuture
addListener
Executor
MoreExecutors#sameThreadExecutor
execute
h79rfbju2#
executeAsync()为语句的执行创建了一个单独的线程,并立即将控件返回给调用者——e1d1e将得到您的结果。使用此方法时,在进入Future之前,您不会知道是否发生任何异常。在Cassandra,你不需要设置任何东西。只需控制应用程序中的线程数,并正确初始化Java驱动程序,以提供符合您需要的PoolingOptions对象。HTH,卡罗
executeAsync()
Future
g2ieeal73#
如果在多线程环境中执行查询,请确保等待executeAsync(语句)完成会话。executeAsync(语句)将立即返回,它不能保证查询是有效的还是成功提交的。因此,如果使用线程池,请始终使用
ResultSetFuture future = session.executeAsync(statement); future.getUninterruptibly();
这将等待查询提交,不会占用内存。
3条答案
按热度按时间lpwwtiir1#
该驱动程序对于多线程使用是安全的。您通常要做的是构建
Cluster
并在应用程序启动期间获取Session
示例,然后在所有线程之间共享Session
。如何处理多线程取决于您的代码。我也不知道SQS,但我想您可能会有多个消费者从队列轮询并自己处理消息,或者可能会将消息发送给一个工作线程池。
关于
executeAsync
,返回的ResultSetFuture
实现了Guava的e1b5d1e,因此您可以使用addListener
注册成功回调。但您必须提供一个Executor
来运行该回调(我不推荐Javadoc中提到的MoreExecutors#sameThreadExecutor
,因为您的回调最终会在驱动程序的一个I/O线程上运行)。正如Carlo所提到的,一个简单的方法是使用同步
execute
,并让您的worker阻塞,直到它收到来自Cassandra的响应,然后确认消息。h79rfbju2#
executeAsync()
为语句的执行创建了一个单独的线程,并立即将控件返回给调用者——e1d1e将得到您的结果。使用此方法时,在进入Future
之前,您不会知道是否发生任何异常。在Cassandra,你不需要设置任何东西。只需控制应用程序中的线程数,并正确初始化Java驱动程序,以提供符合您需要的PoolingOptions对象。
HTH,卡罗
g2ieeal73#
如果在多线程环境中执行查询,请确保等待executeAsync(语句)完成会话。executeAsync(语句)将立即返回,它不能保证查询是有效的还是成功提交的。因此,如果使用线程池,请始终使用
这将等待查询提交,不会占用内存。