1

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

想象一下这个准备好的语句:“插入 some_table (id,time) 值 (?,now())”

准备好之后,每次执行时, now() 将始终相同,无论何时执行。

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

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

4

1 回答 1

3

这听起来像是 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 (它已经在 alia 的开发/测试依赖项中),使用 (unique-time-uuid (java.util.Date .))。

我可能也直接将 uuids 包装在 alia 上,tardis 在某些方面更灵活,但前者是官方的东西。

https://github.com/mpenet/tardis

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

于 2013-06-04T21:57:52.720 回答