8.4 使用预处理语句

对于重复执行的每个 CRUD 语句,X DevAPI 通过在其第二次及后续执行中使用服务器端预处理语句来提高性能。这是在内部发生的 - 只要重用相同的操作对象,应用程序就不需要做任何额外的工作来利用该功能。

当一个语句第二次执行时,只改变了数据值或优化执行结果的值(例如,不同的 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();
}

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

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

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

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