文件首頁
X DevAPI 使用者指南
下載本手冊

X DevAPI 使用者指南  /  語句執行  /  使用預處理語句

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

此迴圈無法善用預處理語句功能,因為 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) 時,預處理語句會被捨棄。