Veel ontwikkelaars gebruiken de asynchrone uitvoeringsmodus liever niet omdat ze denken dat de uitvoering van een
SQLStatement
-instantie niet kan worden gestart als al een andere SQLStatement wordt uitgevoerd via dezelfde databaseverbinding. Dit is niet juist. U kunt de eigenschap
text
van een SQLStatement-instantie niet wijzigen terwijl de instructie wordt uitgevoerd. Als u echter een aparte SQLStatement-instantie gebruikt voor elke verschillende SQL-instructie die u wilt uitvoeren, kunt u de methode
execute()
van een SQLStatement oproepen terwijl een andere SQLStatement-instantie wordt uitgevoerd, zonder dat een fout optreedt.
Wanneer u databasebewerkingen uitvoert in de asynchrone uitvoeringsmodus, heeft elke databaseverbinding (elke
SQLConnection
-instantie) een eigen interne wachtrij of lijst van bewerkingen die de verbinding moet uitvoeren. De runtime voert de bewerkingen één voor één uit in de volgorde waarin ze aan de wachtrij zijn toegevoegd. Wanneer u een SQLStatement-instantie creëert en de overeenkomstige methode
execute()
oproept, wordt de desbetreffende bewerking voor het uitvoeren van de instructie toegevoegd aan de wachtrij van de verbinding. Als er momenteel geen bewerking wordt uitgevoerd voor de desbetreffende SQLConnection-instantie, wordt de uitvoering van de instructie op de achtergrond gestart. U kunt bijvoorbeeld binnen hetzelfde codeblok een andere SQLStatement-instantie creëren en ook de methode
execute()
van de desbetreffende methode oproepen. Die tweede bewerking voor het uitvoeren van de instructie wordt na de eerste instructie in de wachtrij geplaatst. Zodra de eerste instructie is voltooid, voert de runtime de volgende bewerking uit de wachtrij uit. De verwerking van daarop volgende bewerkingen uit de wachtrij vindt op de achtergrond plaats, zelfs wanneer de gebeurtenis
result
voor de eerste bewerking wordt verzonden in de hoofdtoepassingscode. In de volgende code wordt deze techniek geïllustreerd:
// 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.
Er is een belangrijk neveneffect: de database voert automatisch daarop volgende instructies uit de wachtrij uit. Als een instructie afhankelijk is van het resultaat van een andere bewerking, kunt u de instructie niet toevoegen aan de wachtrij (met andere woorden, u kunt de methode
execute()
van de instructie niet oproepen) voordat de eerste bewerking is voltooid. De reden hiervoor is dat nadat u de methode
execute()
van de tweede instructie hebt opgeroepen, u de eigenschap
text
of
parameters
van de instructie niet meer kunt wijzigen. In dat geval kunt u de volgende bewerking pas starten nadat de gebeurtenis is verzonden die aangeeft dat de eerste bewerking is voltooid. Als u bijvoorbeeld een instructie wilt uitvoeren in de context van een transactie, hangt de uitvoering van de instructie af van het openen van de transactie. Nadat u de methode
SQLConnection.begin()
hebt opgeroepen om de transactie te openen, moet u wachten tot de SQLConnection-instantie de gebeurtenis
begin
verzendt. Pas daarna kunt u de methode
execute()
van de SQLStatement-instantie oproepen. In dit voorbeeld is de eenvoudigste manier om de toepassing zo te structureren dat de bewerkingen correct worden uitgevoerd, het creëren van een methode die als listener voor de gebeurtenis
begin
is geregistreerd. De code die de methode
SQLStatement.execute()
oproept, wordt binnen die listenermethode geplaatst.