PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb
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
),预处理语句会被删除。