Java Cassandra更新无法正常工作
我正在使用以下命令更新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
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));