X DevAPI 用户指南  / 第 8 章语句执行  /  8.4 使用准备好的语句

8.4 使用准备好的语句

在 MySQL 8.0.16 及更高版本中实现: X DevAPI 通过在其第二次和后续执行中使用服务器端准备好的语句来提高重复执行的每个 CRUD 语句的性能。这发生在内部——应用程序不需要做任何额外的事情来利用这个特性,只要重复使用相同的操作对象。

当一条语句第二次执行时,仅更改了数据值或改进了执行结果的值(例如,不同offset()limit()值),服务器会为后续执行准备该语句,因此无需重新解析再次运行时的声明。重新执行准备好的语句的新值由参数绑定提供。当通过链接一个改进结果的方法(例如 、 sort()skip()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. 当 aClient重置Session (例如,通过使用Mysqlx.Session.Reset)时,准备好的语句将被删除。