我正在使用Cassandra 1.2.4和1.0.0的Datastax java驱动程序(通过Clojure的Alia,但我认为这不重要)。如果我使用timeuuid列准备一个语句,并将'now()'放在timeuuid的值中,则now()会在编译预准备语句时进行一次计算,然后再也不会。
想象一下这个预备语句:“插入some_table(id,time)值(?,now())”
准备之后,每次执行它时,无论何时执行,now()都将始终相同。
你可以使用min / max timeuuid函数解决这个问题,但是你会失去timeuuid值唯一性的所有好处。实际上,我认为这意味着我无法使用准备好的声明插入timeuuid。
我错过了什么吗?或者是否缺少某项功能?
答案 0 :(得分:3)
这听起来像是卡桑德拉方面的一个错误/缺点。或者,您可以将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的dev / test依赖项中)。
我可能只是直接包装uuids,tardis在某些方面更灵活,但前者是正式的。
https://github.com/mpenet/tardis
我已经向c *人员确认过这将是/可以改进的,如果您想跟踪其进展,这里有一个问题:https://issues.apache.org/jira/browse/CASSANDRA-5616