如何在写入之前检查 Java 字符串是否适合 Cassandra TEXT 列?

How to check if a Java String will fit into Cassandra TEXT column before writing it?

我们支持设计不佳的应用程序。 此应用程序将数据存储在 Cassandra 集群中的 TEXT 列中,有时会在此列中写入相当大的字符串,我们会收到 WriteFailureException.

Cassandra 对写入大小有限制(默认为 16mb:https://docs.datastax.com/en/dse/6.7/dse-admin/datastax_enterprise/config/configCassandra_yaml.html#configCassandra_yaml__max_mutation_size_in_kb),这很好。 我们想通知用户他们正在尝试写入大量数据,以防达到此类限制。 据我了解,无法区分此异常是由于此限制还是由于 Cassandra 集群内的任何其他错误而发生的。

在尝试将日期写入 Cassandra 之前检查日期的大小是否超过限制会更好。 Java String 是 UTF-16,Cassandra 的 TEXT 是 UTF-8,所以我天真的方法是将 String 转换为 UTF-8 并检查它的大小:s.getBytes(StandardCharsets.UTF_8).lenght()

然而,将 String 转换为 UTF-8 只是为了丢弃它似乎相当昂贵。 有没有一种明智的方法来做到这一点?人们如何在写入数据之前检查他们的数据是否适合 Cassandra?

Java8、卡桑德拉3.11

更好的方法是检查请求的大小而不是单个字符串的大小,因为它还取决于协议版本。如果您使用的是准备好的语句,那么您可以绑定值,然后在绑定语句上调用 requestSizeInBytes(对于驱动程序 3.x),就像这样 (source code)

int stmtSize = boundStatement.requestSizeInBytes(protocolVersion, codecRegistry);

对于驱动程序 4.x 它是 computeSizeInBytes 函数 (doc)

但考虑到它是近似大小,但无论如何它可能是相当不错的近似值