【问题标题】:Are CQL list values really limited to 65535 bytes?CQL 列表值真的限制为 65535 字节吗?
【发布时间】:2017-09-16 02:26:15
【问题描述】:

document 列出了 Cassandra 2.2 的许多 CQL 限制。我对SetList 的收集限制特别感兴趣。如果我的解释正确,文档说明 Sets 中的值限制为 65535 字节。

据我所知,这个限制是存在的,因为集合标识是使用存储引擎单元的列名中的复合值实现的(类似于集群列值限制),CQL 将其限制为那么多字节。

考虑一个带有Set 赞的表格

CREATE TABLE test.bounds (
    someid text,
    someorder text,
    words set<text>,
    PRIMARY KEY (someid, someorder)
)

PreparedStatement ps = session.prepare("INSERT INTO test.bounds (someid, someorder, words) VALUES (?, ?, ?)");
BoundStatement bs = ps.bind("id", "order", ImmutableSet.of(StringUtils.repeat('a', 66000)));
session.execute(bs);

这将引发预期的异常

Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: The sum of all clustering columns is too long (66024 > 65535)

现在,如果我将表格更改为使用 List 而不是 Set

CREATE TABLE test.bounds (
    someid text,
    someorder text,
    words list<text>,
    PRIMARY KEY (someid, someorder)
)

并使用

BoundStatement bs = ps.bind("id", "order", ImmutableList.of(StringUtils.repeat('a', 66000)));

我没有收到异常。 但是,文档指出 List 的值大小也限制为 65535 字节。文档不正确还是我误解了?

我假设List 值在底层存储中实现为简单的列值,并且通过它们的时间戳来维护顺序。

【问题讨论】:

    标签: java cassandra cql


    【解决方案1】:

    据我了解,这里的文档是错误的。该限制在协议版本 3 中已更改(在 C* 2.1 中引入)。来自协议 3 更改部分下的 native protocol specification

    • 集合的序列化格式已更改(集合大小和 每个参数的长度现在是 4 个字节长)。请参阅第 6 节。

    因此,只要您使用协议版本 3 或更高版本,您就可以创建包含多达 2^31-1 字节 (2147483647) 或元素的列表。

    编辑:我刚刚注意到您关于集合标识的评论,这可能是存储引擎本身的限制,所以也许文档是出于这个原因留下的,但协议本身现在支持更大的集合。将继续看看我们是否可以记录这种细微差别。

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 2023-03-24
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多