1

Cassandra 1.2.4 および 1.0.0 の Datastax Java ドライバーを使用しています (Clojure の Alia を使用していますが、ここでは問題ではないと思います)。timeuuid 列を持つステートメントを準備し、timeuuid の値に「now()」を入れると、準備されたステートメントがコンパイルされるときに now() が一度評価され、その後は二度と評価されません。

この準備されたステートメントを想像してみてください: "insert into some_table (id,time) values (?,now())"

準備した後は、実行するたびに、いつ実行しても now() は常に同じになります。

min/max timeuuid 関数を使用してこれを回避できますが、timeuuid 値の一意性のすべての利点が失われます。事実上、これは、準備されたステートメントを使用して timeuuid を挿入できないことを意味すると思います。

何か不足していますか?または機能が不足していますか?

4

1 に答える 1

3

これは、cassandra 側のバグ/欠点のように聞こえます。別の方法として、uuid インスタンスを値としてプリペアド ステートメントに渡すこともできます。

some_table (id,time) 値 (?,?) に挿入

次に、Java-driverの UUID 名前空間http://www.datastax.com/drivers/java/apidocs/com/datastax/driver/core/utils/UUIDs.html#timeBased()から作成した UUID インスタンスを使用します。または com.eaio.uuid.UUID インスタンス、後者は clojure ラッパーから作成できます: mpenet/tardis (これは既にエイリアスの dev/test 依存関係にあります)、 (unique-time-uuid (java.util.Date .)))。

uuid もエイリアスに直接ラップするだけかもしれませんが、tardis はいくつかの点でより柔軟ですが、前者は公式のものです。

https://github.com/mpenet/tardis

私はc*の人々にこれが改善される/改善される可能性があることを確認しました。進行状況を追跡したい場合は、ここに問題があります: https://issues.apache.org/jira/browse/CASSANDRA-5616

于 2013-06-04T21:57:52.720 に答える