PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb
通过对第二次及后续执行使用服务器端预处理语句,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
),预处理语句将被删除。