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();
}

此循环无法利用预处理语句功能,因为在 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),预处理语句将被删除。