瞭解非同步執行模式

Adobe AIR 1.0 以及更新的版本

使用非同步執行模式有一項常見的隱憂,就是如果其它 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() 方法的程式碼會放置於該偵聽程式方法之中。