Cassandra datastax cpp驱动程序 - 避免不必要的副本

时间:2014-10-28 09:02:35

标签: c++ cassandra

我一直在使用以下模式为Cassandra构建插入语句(使用datastax cpp驱动程序):

ssStmt1 << "Insert Into some table (...) Values (....)"
string          sStatement1     = ssStmt1.str();
CassString      cass1           = cass_string_init(sStatement1.c_str());
CassStatement*  pStmt1          = cass_statement_new(cass1, 0);

我也尝试过以下模式:

CassString      cass1   = cass_string_init("Insert Into some table (id, date, c ) Values (?, ?, ?);");
CassStatement*  pStmt1  = cass_statement_new(cass1, 3);

cass_statement_bind_uuid  ( pStmt1, 0, uuidKey);
cass_statement_bind_int64 ( pStmt1, 1, timestamp);
cass_statement_bind_string( pStmt1, 2, sSomething);

第一种模式适用于复合键,第二种模式不适用。密钥由时间戳和uuid组成。

timestamp字段有两个错误之一(取决于使用的绑定语句)。

当这样绑定时:

cass_statement_bind_int64_by_name ( pStmt1, "date", timestamp);

我收到以下错误:

Invalid null value for clustering key part.

以这种方式绑定:

cass_statement_bind_int64 ( pStmt1, 1, timestamp);

我收到以下错误:

Expected 8 or 0 byte long for date (19)

上面的第一个模式将数据写入字符串流。然后将其复制到std :: string,然后复制到CassString,例如这是非常低效的;当使用Cassandra的目的是为了高交易率时,这是不好的。

有人可以解释为什么我在尝试将int64绑定到时间戳字段时遇到这些错误吗?

(时间戳存储在cassandra中为int64 - 自纪元以来的毫秒数.cassandra.h文件表示它们被绑定为int64)

https://github.com/datastax/cpp-driver/blob/9b0c5c/include/cassandra.h (搜索时间戳)

1 个答案:

答案 0 :(得分:2)

我需要更多信息来确定您收到此错误的原因:

  

日期(19)预计8或0字节长

您能分享您的代码吗?

以下错误是尝试在未准备的语句上使用“by_name”方法的结果:

  

群集关键部分的空值无效。

要按名称绑定值,需要通过准备语句返回元数据。参考:https://github.com/datastax/cpp-driver/blob/1.0/include/cassandra.h#L1021-L1022另外,请务必检查cass_statement_bind_int64_by_name()的结果。

我创建了一个使用复合键和复合分区键的示例: https://gist.github.com/mpenick/ba44e24300609994ecb4

希望这有帮助。