Ett vanligt missförstånd om asynkron körning är att det inte går att påbörja en körning av en
SQLStatement
-instans om det redan körs en annan SQLStatement-instans mot samma databasanslutning. Detta antagande är felaktigt. Du kan inte ändra
text
-egenskapen för satsen medan en SQLStatement-instans körs. Men om du däremot använder en separat SQLStatement-instans för varje SQL-sats som du vill köra kan du anropa
execute()
-metoden för en SQLStatement-instans medan en annan SQLStatement-instans fortfarande körs, utan att det uppstår något fel.
När du kör databasåtgärder internt i asynkront körningsläge har varje databasanslutning (varje
SQLConnection
-instans) en egen kö eller lista med åtgärder som den har instruerats att utföra. Varje åtgärd körs i följd, i den ordning de har lagts till i kön. När du skapar en SQLStatement-instans och anropar dess
execute()
-metod läggs satskörningsåtgärden till i kön för anslutningen. Om ingen åtgärd redan körs på SQLConnection-instansen börjar satsen köras i bakgrunden. Anta att du i samma kodblock skapar en annan SQLStatement-instans och också anropar den metodens
execute()
-metod. Den andra satskörningsåtgärden läggs i så fall till efter den första satsen i kön. När den första satsen har slutförts körs nästa åtgärd i kön. Bearbetningen av efterföljande åtgärder i kön utförs i bakgrunden, även när
result
-händelsen för den första åtgärden skickas i huvudprogramkoden. Den här tekniken visas i följande kod:
// 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.
Det finns en viktig sidoeffekt av att efterföljande satser i kön körs automatiskt. Om en sats är beroende av resultatet av en annan åtgärd kan du inte lägga till satsen i kön (du kan med andra ord inte anropa dess
execute()
-metod) förrän den första åtgärden har slutförts. Det beror på att när du väl har anropat den andra satsens
execute()
-metod kan du inte ändra satsens
text
- eller
parameters
-egenskaper. I så fall måste du vänta på händelsen som anger att den första åtgärden har slutförts innan du kan påbörja nästa åtgärd. Om du t. ex. vill köra en sats i överföringskontext är satskörningen beroende av åtgärden som öppnar transaktionen. När du har öppnat transaktionen genom att anropa metoden
SQLConnection.begin()
måste du vänta tills SQLConnection-instansen har skickat en
begin
-händelse. Du kan inte anropa SQLStatement-instansens
execute()
-metod förrän händelsen har skickats. I det här exemplet är det enklaste sättet att organisera programmet för att säkerställa att åtgärderna körs korrekt att skapa en metod som är registrerad som en lyssnare för
begin
-händelsen. Koden som ska anropa metoden
SQLStatement.execute()
placeras inom den lyssnarmetoden.