gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:10:41 25 4
gpt4 key购买 nike

如果我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com