Cassandra 卡桑德拉-批次过大

Cassandra 卡桑德拉-批次过大,cassandra,datastax,Cassandra,Datastax,我有一个必须添加到采购订单中的产品列表。采购订单有一个序列号,一旦添加了产品,它们的状态就应该改变,以表明这些产品已准备采购 一份采购订单中处理的产品的典型数量为500 在DB-I上有两个表->1个用于产品,另一个用于采购订单。这意味着我需要500次更新和1次插入。 当我试图在BatchStatement中执行此操作时,我得到的错误是:批处理太大 来自不同方面的建议告诉我应该使用多个异步查询。然而,我关心的是整个操作的原子性。 鉴于我的要求,请提出最好的解决办法 提前谢谢。这很有趣。将大量插入(

我有一个必须添加到采购订单中的产品列表。采购订单有一个序列号,一旦添加了产品,它们的状态就应该改变,以表明这些产品已准备采购

一份采购订单中处理的产品的典型数量为500

在DB-I上有两个表->1个用于产品,另一个用于采购订单。这意味着我需要500次更新和1次插入。 当我试图在BatchStatement中执行此操作时,我得到的错误是:批处理太大

来自不同方面的建议告诉我应该使用多个异步查询。然而,我关心的是整个操作的原子性。 鉴于我的要求,请提出最好的解决办法


提前谢谢。

这很有趣。将大量插入(>10)插入一个批(以实现原子性)实际上是一个糟糕的性能,因此提高批限制并不是一个真正的选项

由于Cassandra也在单行级别管理原子性,您可以通过更改模型来利用这一点,方法是添加一个表以“书签”您的采购订单,在其中您只将采购订单id和项目存储在一行中,并将其存储到映射中,因此您的查询具有幂等性。然后,您可以根据需要展开或后处理此表以继续您的工作流

然而,我关心的是整个操作的原子性。鉴于我的要求,请提出最好的解决办法

请注意,Cassandra批次不提供隔离():

注意,我们在数据库中的意思是“原子”,即如果批处理的任何部分成功,那么所有部分都会成功。未暗示任何其他担保;特别是没有孤立,;其他客户端将能够从批处理中读取第一个更新的行,而其他客户端正在进行

因此,如果您需要隔离,正如@xmas79所回答的,您应该将产品和采购订单存储在一个表中

如果隔离和性能不重要,您可以尝试调优Cassandra yaml并增加
批处理大小\u失败\u阈值\u(单位:kb)
参数的值

超过此值的任何批次均失败。默认情况下为50kb(10x警告阈值)