批处理中的Cassandra语句可以使用cpp驱动程序分别设置时间戳吗?

时间:2016-05-26 12:05:45

标签: 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. 创建语句
  4. 使用cass_statement_set_timestamp
  5. 设置每个语句的时间戳
  6. 使用cass_batch_add_statement
  7. 将语句添加到批处理中
  8. 使用cass_session_execute_batch
  9. 执行批处理

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

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

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

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

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

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

    我正在使用Cassandra C ++驱动程序版本2.2.2和数据库版本2.2.5,据我所知,它使用的是本机协议版本4

1 个答案:

答案 0 :(得分:1)

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

Native Protocol v4 spec