文档首页
X DevAPI 用户指南
下载本手册
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


X DevAPI 用户指南  /  语句执行  /  使用预处理语句

8.4 使用预处理语句

X DevAPI 通过对重复执行的每个 CRUD 语句使用服务器端预处理语句来提高性能。 这是在内部发生的——应用程序无需执行任何额外操作即可利用此功能,只要重复使用相同的操作对象即可。

当一个语句第二次执行时,只有数据值或细化执行结果的值(例如,不同的 offset()limit() 值)发生更改,服务器会为后续执行准备该语句,因此在再次运行该语句时无需重新解析。 通过参数绑定提供准备好的语句重新执行的新值。 当语句通过将一个细化结果的方法链接到它而被修改时(例如,sort()limit()offset()),该语句会被重新准备。 以下伪代码及其注释展示了此功能

var f = coll.find("field = :field");
f.bind("field", 1).execute(); // Normal execution
f.bind("field", 2).execute(); // Same statement executed with a different parameter value triggers statement preparation
f.bind("field", 3).execute(); // Prepared statement executed with a new value
f.bind("field", 3).limit(10).execute(); // Statement reprepared as it is modified with limit()
f.bind("field", 4).limit(20).execute(); // Reprepared statement executed with new parameters

请注意,要利用此功能,必须在语句的重复中重复使用相同的操作对象。 看看这个例子

for (i=0; i<100; ++i) {
    coll.find("field = :field").bind("field", i).execute();
}

此循环无法利用预处理语句功能,因为 coll.find() 的操作对象在 for 循环的每次迭代中都会重新创建。 现在,看看这个例子

var f = coll.find("field = :field");
 
for (i=0; i<100; ++i) {
    f.bind("field", i).execute();
}

重复的语句被准备一次,然后被重复使用,因为 coll.find() 的相同操作在 for 循环的每次迭代中都会重新执行。

预处理语句是 Session 的一部分。 当 Client 重置 Session 时(例如,使用 Mysqlx.Session.Reset),预处理语句会被删除。