使用非同步執行模式有一項常見的隱憂,就是如果其它 SQLStatement 目前正針對相同的資料庫連線執行,就會推斷您不能開始執行
SQLStatement
實體。事實上,這種推斷並不正確。在 SQLStatement 實體執行時,您不能變更陳述式的
text
屬性,但是,如果您要執行的各個不同 SQL 陳述式都使用不同的 SQLStatement 實體,您可以呼叫 SQLStatement 的
execute()
方法,同一時間,其它 SQLStatement 實體仍然在執行中,並不會導致錯誤。
在內部,當您使用非同步執行模式執行資料庫作業時,每個資料庫連線 (每個
SQLConnection
實體) 本身都具備其佇列或指示要執行的作業清單。執行階段會依序執行各項作業,依加入佇列中的順序執行。當您建立 SQLStatement 實體並呼叫其
execute()
方法時,該陳述式執行作業會加入連線的佇列。如果目前在該 SQLConnection 實體上並沒有執行作業,陳述式會開始在背景中執行。假設在相同程式碼區塊之內,您建立了其它 SQLStatement 實體,而且也呼叫該方法的
execute()
方法。這第二個陳述式執行作業就會加入佇列中第一個陳述式之後。第一個陳述式完成執行之後,執行階段就會繼續佇列中的下一項作業。即使第一項作業的
result
事件正在主應用程式的程式碼中傳送,佇列中後續作業的處理也會在背景中進行。下列程式碼會示範這項技巧:
// Using asynchronous execution mode
var stmt1:SQLStatement = new SQLStatement();
stmt1.sqlConnection = conn;
// ... Set statement text and parameters, and register event listeners ...
stmt1.execute();
// At this point stmt1's execute() operation is added to conn's execution queue.
var stmt2:SQLStatement = new SQLStatement();
stmt2.sqlConnection = conn;
// ... Set statement text and parameters, and register event listeners ...
stmt2.execute();
// At this point stmt2's execute() operation is added to conn's execution queue.
// When stmt1 finishes executing, stmt2 will immediately begin executing
// in the background.
資料庫若自動執行佇列中的後續陳述式,會有一項重大的副作用。如果陳述式取決於其它作業的結果,就不能將陳述式加入佇列中 (也就是說,您不能呼叫其
execute()
方法),必須要等到第一項作業完成後才行。這是因為,一旦您呼叫第二個陳述式的
execute()
方法,就不能變更陳述式的
text
或
parameters
屬性。在此情況下,您必須等候事件指出第一項作業已經完成,才能開始第二項作業。例如,如果您要在交易中執行陳述式,而該陳述式取決於正在開啟的交易作業。呼叫
SQLConnection.begin()
方法開啟交易之後,您必須等候 SQLConnection 實體傳送其
begin
事件。之後,您才能呼叫 SQLStatement 實體的
execute()
方法。在此範例中,組織應用程式以確保作業正確執行的最簡單方式,就是建立註冊為
begin
事件之偵聽程式的方法。呼叫
SQLStatement.execute()
方法的程式碼會放置於該偵聽程式方法之中。
|
|
|