如果我使用 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++ 驱动程序做类似的事情,我会做这样的事情:
- 使用 cass_batch_new 创建批处理
- 使用 cass_future_get_prepared 然后 cass_prepared_bind 创建语句
- 使用 cass_statement_set_timestamp 在每个语句上设置时间戳
- 使用 cass_batch_add_statement 将语句添加到批处理
- 使用 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)不支持批处理中每个语句的时间戳,因此驱动程序无法发送一个。
关于cassandra - 批处理中的 Cassandra 语句是否可以使用 cpp 驱动程序具有单独的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460390/