PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb
对于重复执行的每个 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
),预处理语句将被删除。