Wyjaśnienie modelu wykonywania asynchronicznego

Adobe AIR 1.0 i starsze wersje

Typowym problemem związanym z trybem wykonywania asynchronicznego jest brak możliwości uruchomienia instancji SQLStatement , jeśli wykonywana jest inna instancja klasy SQLStatement dla tego samego połączenia z bazą danych. W rzeczywistości założenie takiego działania jest niepoprawne. Podczas działania instancji klasy SQLStatement nie ma możliwości zmiany właściwości text instrukcji. Jeśli jednak używana jest osobna instancja klasy SQLStatement dla każdej innej instrukcji SQL, która ma zostać wykonana, wówczas należy wywołać metodę execute() klasy SQLStatement podczas wykonywania innej instancji SQLStatement i nie spowoduje to błędu.

Podczas wykonywania operacji na bazie danych przy użyciu trybu wykonywania asynchronicznego każde połączenie z bazą danych (każda instancja SQLConnection ) ma własną kolejkę lub listę operacji, które ma wykonywać. Środowisko wykonawcze wykonuje operacje w kolejności, w jakiej są dodawane do kolejki. Po utworzeniu instancji klasy SQLStatement i wywołaniu jej metody execute() ta operacja wykonania instrukcji zostaje dodana do kolejki połączenia. Jeśli żadna operacja nie jest aktualnie wykonywana na instancji klasy SQLConnection, wówczas wykonanie instrukcji rozpoczyna się w tle. Załóżmy, że w jednym bloku kodu utworzona zostaje inna instancja klasy SQLStatement, a ponadto zostaje wywołana metoda execute() tej metody. Operacja wykonania drugiej instrukcji zostanie dodana do kolejki po pierwszej instrukcji. Gdy zakończy się wykonywanie pierwszej instrukcji, środowisko wykonawcze przechodzi do kolejnej operacji w kolejce. Przetwarzanie kolejnych operacji w kolejce odbywa się w tle, nawet jeśli zdarzenie result dla pierwszej operacji zostanie wywołane w głównym kodzie aplikacji. Poniższy kod prezentuje tę technikę:

// 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. 

Istnienie istotny skutek automatycznego wykonywania przez bazę danych kolejnych instrukcji z kolejki. Jeśli instrukcja jest uzależniona od wyniku innej operacji, instrukcji nie można dodać do kolejki (innymi słowy: nie można wywołać jej metody execute() ) do czasu zakończenia pierwszej operacji. Dzieje się tak, ponieważ po wywołaniu metody execute() drugiej instrukcji nie można zmienić właściwości text ani parameters instrukcji. W takim przypadku należy oczekiwać na zdarzenie wskazujące zakończenie pierwszej operacji — dopiero wówczas można uruchomić kolejną operację. Na przykład: jeśli wymagane jest wykonanie instrukcji w kontekście transakcji, instrukcja jest uzależniona od operacji otwarcia transakcji. Po wywołaniu metody SQLConnection.begin() w celu otwarcia transakcji należy odczekać, aż instancja klasy SQLConnection wywoła zdarzenie begin . Tylko wówczas można wywołać metodę execute() instancji klasy SQLStatement. W tym przykładzie najprostszym sposobem na zorganizowanie aplikacji w celu zapewnienia, że operacje są wykonywane poprawnie, jest utworzenie metody, która zostanie zarejestrowana jako detektor zdarzenia begin . Kod metody SQLStatement.execute() zostanie umieszczony w metodzie detektora.