cassandra - 批处理中的 Cassandra 语句是否可以使用 cpp 驱动程序具有单独的时间戳?

标签 cassandra

如果我使用 CQL 使用 Cassandra 批处理语句,那么每个语句都可以有一个单独的时间戳。例如,像这样的东西:

BEGIN BATCH
  INSERT INTO users (name, surname) VALUES ('Bob', 'Smith') USING TIMESTAMP 10000001;
  DELETE FROM users USING TIMESTAMP 10000000 WHERE user='Bob';
APPLY BATCH;

如果我尝试使用 C++ 驱动程序做类似的事情,我会做这样的事情:

  1. 使用 cass_batch_new 创建批处理
  2. 使用 cass_future_get_prepared 然后 cass_prepared_bind 创建语句
  3. 使用 cass_statement_set_timestamp 在每个语句上设置时间戳
  4. 使用 cass_batch_add_statement 将语句添加到批处理
  5. 使用 cass_session_execute_batch 执行批处理

然后我希望它的行为方式与 CQL 批处理语句相同,因为批处理中的每个语句都使用自己单独的时间戳执行。但是,根据我的测试,我无法让它发挥作用。它似乎使用单个时间戳执行了整个批处理。

类似地,如果我创建一个单调时间戳生成器来为我生成时间戳,它似乎只为批处理使用时间戳,而不是为单个语句使用时间戳。

我查看了 C++ 驱动程序的源代码,看起来当它对批处理中的语句进行编码以发送到数据库时(在 ExecuteRequest::encode_batch 中),它不会尝试对批处理中每个语句的时间戳,仅适用于整个批处理。当对不在批处理中的单个语句进行编码时,它会为语句编码时间戳(在 ExecuteRequest::internal_encode 中)。

作为解决方法,我可以将“USING TIMESTAMP 10000001”直接放入 CQL 字符串中,而不是使用 cass_statement_set_timestamp 在语句上设置时间戳,然后它会按预期工作。因此,数据库似乎可以在批处理中的每个语句上正确地具有单独的时间戳,但 C++ 驱动程序无法发送它们。

但是使用“USING TIMESTAMP 10000001”将时间戳直接放入 CQL 中,然后我不能通过仅将新值绑定(bind)到它来重用该语句。我需要重新准备声明。

有没有其他人尝试过这个并设法让它工作?或者它只是 C++ 驱动程序的一个已知限制?

我使用的是 Cassandra C++ 驱动程序版本 2.2.2 和数据库版本 2.2.5,据我所知这是使用 native 协议(protocol)版本 4

最佳答案

我还在 Cassandra C++ 驱动程序邮件列表 Google 组中提出了这个问题,Michael Penick 回复说目前不可能。底层协议(protocol)不支持批处理中每个语句的时间戳,因此驱动程序无法发送一个。

Native Protocol v4 spec

关于cassandra - 批处理中的 Cassandra 语句是否可以使用 cpp 驱动程序具有单独的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460390/

相关文章:

apache-spark - 是否建议使用 Kafka 作为事实来源?

Cassandra 条件更新与 IF EXISTS 结合

scala - 从 Cassandra 读取数据在 Flink 中处理

scala - 如何在 phantom-dsl 中连续更新多个字段?

java - 禁用lagom框架的嵌入式cassandra

java - 为什么最新版本的 apache-cassandra-X.X.X.jar 中没有 CqlStorage 类

Cassandra 控制 SSTable 大小

http - 在 Apache Cassandra 中存储和显示图像文件

Cassandra 修补列表并产生意外结果

cassandra - cassandra 中的 is not null 或 not equal 子句