【问题标题】:Cassandra Datastax driver prepared statement evaluates 'now()' once onlyCassandra Datastax 驱动程序准备好的语句仅评估“now()”一次
【发布时间】:2013-05-31 05:57:02
【问题描述】:

我正在使用 Cassandra 1.2.4 和 1.0.0 的 Datastax java 驱动程序(通过 Clojure 的 Alia,但我认为这不重要)。如果我准备一个带有 timeuuid 列的语句,并将 'now()' 放入 timeuuid 的值中,则 now() 在编译准备好的语句时被评估一次,然后再也不会。

想象一下这个准备好的语句:“insert into some_table (id,time) values (?,now())”

在你准备好之后,每次执行,now() 总是一样的,不管你什么时候执行。

您可以使用 min/max timeuuid 函数解决这个问题,但是您会失去 timeuuid 值唯一性的所有好处。实际上,我认为这意味着我无法使用准备好的语句插入 timeuuid。

我错过了什么吗?还是缺少某个功能?

【问题讨论】:

    标签: cassandra datastax-java-driver


    【解决方案1】:

    这听起来像是 cassandra 方面的错误/缺点。或者,您可以将 uuid 实例作为值传递给准备好的语句:

    插入 some_table (id,time) 值 (?,?)

    然后使用您从 java-driver 中的 UUIDs 命名空间 http://www.datastax.com/drivers/java/apidocs/com/datastax/driver/core/utils/UUIDs.html#timeBased() 创建的 UUID 实例或 com.eaio.uuid.UUID 实例,您可以从 clojure 包装器创建后者:mpenet/tardis(它位于已经使用(unique-time-uuid (java.util.Date.))的 alia 的开发/测试依赖项。

    我也可以直接把 uuids 包在 alia 上,tardis 在某些方面更灵活,但前者是官方的。

    https://github.com/mpenet/tardis

    我已与 c* 人确认这是将/可以改进的东西,如果您想跟踪其进度,这里有一个问题:https://issues.apache.org/jira/browse/CASSANDRA-5616

    【讨论】:

    • 我刚刚做了我提到的 Alia 1.4.0 ,见mpenet.github.io/alia/qbits.alia.uuid.html
    • 在 alia 中包装 uuid 是理想的——这也让我可以立即访问代码中生成的 uuid。我正在将我的 alia dep 更新到 1.4.0,现在就试一试。谢谢!
    • 很高兴听到它有效。似乎 CASSANDRA-5616 上的事情进展很快,这很可能在 cassandra 1.2.6 中得到修复。
    猜你喜欢
    • 2015-06-23
    • 2015-04-30
    • 2017-11-05
    • 1970-01-01
    • 2015-04-30
    • 2013-07-03
    • 2013-07-10
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多