当前位置: 首页 > 知识库问答 >
问题:

cql二进制协议和已准备查询中的命名绑定变量

袁高明
2023-03-14

想象一下,我有一个简单的CQL表

CREATE TABLE test (
k int PRIMARY KEY,
v1 text,
v2 int,
v3 float
)

在许多情况下,人们会希望利用Cassandra的无模式本质,只设置一些值,例如

INSERT into test (k, v1) VALUES (1, 'something');

当编写应用程序以写入Cassandra集群中的CQL表时,出于性能原因,需要立即使用准备好的语句来完成此操作。

这由不同的驾驶员以不同的方式处理。例如,Java驱动程序引入了(在CQL二进制协议修改的帮助下)使用命名绑定变量的机会。非常实用:CASSANDRA-6033

我想知道的是,从二进制协议的角度来看,在准备好的查询中只为绑定变量的子集提供值的正确方法是什么?

实际上,值是通过构建值列表提供给准备好的查询的,如中所述

4.1.4. QUERY 
[...]
Values. In that case, a [short] <n> followed by <n> [bytes]
values are provided. Those value are used for bound variables in
the query.

请注意[bytes]的定义

[bytes]        A [int] n, followed by n bytes if n >= 0. If n < 0,
               no byte should follow and the value represented is `null`.

从这个描述中,我得到以下信息:

  1. QUERY中的“值”没有提供为特定列提供值的方法。它只是值的有序列表。我想[短]必须对应于准备好的查询中绑定变量的确切数量?
  2. 所有值,无论它们是什么类型,都表示为[bytes]。如果为真,则[bytes]值的任何解释都留给服务器(转换为int、短、文本、…)?

假设我做对了,我想知道“null”[bytes]值是否可以用来“跳过”绑定变量而不为其赋值。

我试过这个,打了cpp驱动的补丁(这也是我感兴趣的)。执行查询,但是当我执行SELECT from clqsh时,我没有看到空字段的“null”字符串表示,所以我想知道这是否是一种黑客行为,由于某些原因,这不仅仅是崩溃,或者是实现这一点的预期方式。

我很抱歉,但我真的不认为我可以下载java驱动程序,看看命名绑定变量是如何实现的!:(

-编辑-已解决-

我的假设是正确的,现在支持跳过准备好的查询中的字段已通过使用null[bytes value]添加到cpp驱动程序(参见此处)。

共有2个答案

冉昊
2023-03-14

我试图实现的目标已经根据我描述的原则完成了(见这里)。

郦昆
2023-03-14

我想知道的是,从二进制协议的角度来看,在准备好的查询中只为绑定变量的子集提供值的正确方法是什么?

您需要准备一个只插入/更新感兴趣的列子集的查询。

QUERY 中的“值”不提供为特定列提供值的方法。它只是一个有序的值列表。我猜[短]必须对应于准备好的查询中绑定变量的确切数量?

没错。排序由Cassandra在准备查询时返回的列元数据决定。

所有值,无论它们是什么类型,都表示为[字节]。如果这是真的,对[bytes]值的任何解释都将留给服务器(转换为int、short、text…)?

那也是正确的。驱动程序将使用返回的列元数据来确定如何将本机值(字符串、UUIDS、int等)转换为二进制(字节)格式。Cassandra在服务器端做与此相反的操作。

假设我做对了,我想知道“null”[bytes]值是否可以用来“跳过”绑定变量而不为其赋值

空列插入被解释为删除。

 类似资料:
  • 我正在寻找一种指定二进制数据的技术规范方法。我正在寻找XML模式描述(XSD)之类的东西。 目的是使用该格式生成可以正确解释二进制序列的程序;即编程语言绑定。这就像XSD的许多框架可以生成OO编程语言中的类,可以表示XML-Data、解析和序列化。尽管如此,方法论需要具有高度的人类可读性,以便领域专家可以指定和解释此文本规范。 到目前为止,我只找到了人类可读的语法。在许多标准中使用了ASCII-A

  • 我刚刚开始与SSO Saml的工作,有一些混乱,想澄清。-如果我必须用三种机制编码AuthnRequest,Deflate编码,Base64编码,URL编码。我必须使用HTTP-Redirect来发送消息请求吗?-HTTP-重定向绑定我参考https://docs . oasis-open . org/security/SAML/v 2.0/SAML-bindings-2.0-OS . pdf第1

  • 我们说,要实现 Memcached 的 GET, SET, 和 DELETE 操作。我们仅仅关注这些,但 memcached 协议有一个通用的结构,只有少数参数改变为了改变一个请求或响应的意义。这意味着您可以轻松地扩展实现添加其他命令。一般协议有 24 字节头用于请求和响应。这个头可以分解如下表14.1中。 Table 14.1 Sample Memcached header byte struc

  • 我正在构建一个软件来远程控制连接到另一台PC的无线电硬件。 我计划使用ZeroMQ进行传输,并使用类似于RPC的请求-回复,其上有表示操作的不同消息。 虽然我的大多数消息只是一些控制和状态信息,但应该可以选择设置要传输的数据blob或请求要接收的数据blob。这些数据blob通常在5-10MB的范围内,但也应该可以使用最大100MB的较大blob。 对于消息格式,我发现google协议缓冲区非常有

  • Hprose 远程过程调用(RPC)通讯可以在任何底层网络协议上传输。例如 HTTP,TCP 或 UNIX socket。 HTTP 绑定 当 hprose 远程过程调用(RPC)工作于 HTTP 之上时,hprose 远程过程调用(RPC)的数据作为 POST 请求的 body 部分发送,以响应的 body 部分返回。 Hprose 远程过程调用(RPC) 对 HTTP 的头部(head)没有任

  • 如何定制协议 实际上制定自己的协议是比较简单的事情。简单的协议一般包含两部分: 区分数据边界的标识 数据格式定义 一个例子 协议定义 这里假设区分数据边界的标识为换行符”\n”(注意请求数据本身内部不能包含换行符),数据格式为Json,例如下面是一个符合这个规则的请求包。 {"type":"message","content":"hello"}   注意上面的请求数据末尾有一个换行字符(在PHP中