【问题标题】:Cassandra datastax cpp driver - avoiding unnecessary copiesCassandra datastax cpp 驱动程序 - 避免不必要的副本
【发布时间】:2014-10-28 09:02:34
【问题描述】:

我一直在使用以下模式来构造我对 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 组成。

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

当这样绑定时:

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 绑定到时间戳字段时遇到这些错误?

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

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

【问题讨论】:

    标签: c++ cassandra


    【解决方案1】:

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

    日期 (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

    希望这会有所帮助。

    【讨论】:

    • 谢谢你;我将在今天晚些时候查看您的示例并做出回应。
    猜你喜欢
    • 2016-02-27
    • 2017-01-20
    • 2017-11-15
    • 1970-01-01
    • 2018-02-15
    • 2013-12-23
    • 2015-10-25
    • 2020-02-01
    • 2016-10-02
    相关资源
    最近更新 更多