Java Cassandra更新无法正常工作

Java Cassandra更新无法正常工作,java,cassandra,cassandra-2.0,Java,Cassandra,Cassandra 2.0,我正在使用以下命令更新cassandra表。有时更新,有时不更新 updateproductset count=count+1,其中productId=?和productname=?时间= 它从不出错 为什么会这样 编辑 表结构 创建不存在的表产品(productId int、productname text、时间戳、计数计数器、主键(productId、productname、time))通过查看您的(Java?)代码,我真的不知道insertUpdateTable是什么类型的对象。但是bin

我正在使用以下命令更新cassandra表。有时更新,有时不更新

updateproductset count=count+1,其中productId=?和productname=?时间=

它从不出错

为什么会这样

编辑

表结构

创建不存在的表产品(productId int、productname text、时间戳、计数计数器、主键(productId、productname、time))

通过查看您的(Java?)代码,我真的不知道insertUpdateTable是什么类型的对象。但是
bind
方法应该返回一个可以执行的BoundStatement对象。虽然
UpdateTable
确实是一个BoundStatement,但我看不出您实际上是在将变量绑定到它

基于显示的代码数量有限,我在这里看到两种解决方案:

  • 会话中调用
    UpdateTable
    上的
    bind
    方法。执行

    执行(UpdateTable.bind(productId、productname、time))

  • 插入更新表包装起来。在
    会话中绑定
    。执行

    执行(insertUpdateTable.bind(productId、productname、time))

  • 有关更多信息,请查看关于Java驱动程序的DataStax文档

    有时更新,有时不更新

    如果您发布了您的Cassandra表定义,它可能会对此有更多的了解。但重要的是要记住,Cassandra主键是唯一的,
    INSERT
    s和
    UPDATE
    s本质上是相同的(INSERT
    可以“更新”现有值,
    UPDATE
    可以“插入”新值)。有时,
    更新
    可能不起作用,因为它可能正在使用相同的键值执行写入操作。只是一些需要注意的事情

    同样需要注意的是,
    更新产品集计数=计数+1
    仅在两种情况下有效:

  • count
    是计数器列

  • product
    是一个计数器表,仅由键和计数器列组成(所有非计数器列必须是主键的一部分)


  • 值得注意的是,计数器列。如果您需要使用计数器并且仍在Cassandra 2.0上,则可能值得升级。

    您说过更新有时会起作用,但请注意,如果您使用计数器删除行,您将无法在不删除表并重新创建它的情况下再次修改行。更新将以静默方式失败。有关更多信息,请参见

    我在高频写入和更新期间遇到类似问题

    随着并发请求数量的增加,最新绑定很可能会重写以前的绑定参数。因此,在session.execute中使用preparedStatement.bind()而不是使用单个boundStatement

    你能试试下面的吗

    而不是使用:

    BoundStatement UpdateTable = new BoundStatement(preparedStatement);
    
    
    UpdateTable.bind(productId, productname, time);
    
    session.execute(UpdateTable);
    
    使用:


    已经用表格结构更新了问题。这是一个java代码。正如我所说的,它从不抛出任何错误。但是,有时有效,有时无效。另外,当我检查日志时,我看到了其中的值。我不知道发生了什么。@user4974500问题是,您不会看到错误消息,因为所有内容在语法上都是正确的。system.log是否在运行更新时显示任何相关消息?如果可能的话,试着在2.1测试集群上运行这个测试,看看你的结果是否更加一致。集群中有多少个节点,读写一致性是什么?集群中只有一个
    节点,并且
    并发读取:32
    并发写入:32
    并发计数器写入:32
    UpdateTable.bind(productId, productname, time);
     session.execute(UpdateTable);
    
    session.execute(preparedStatement.bind(productId, productname, time));