了解异步执行模式

Adobe AIR 1.0 和更高版本

使用异步执行模式的一个常见问题就是,假设您当前正在对同一个数据库连接执行某个 SQLStatement 实例,则无法开始执行另一个 SQLStatement 实例。事实上,此假定是不正确的。在 SQLStatement 实例执行的同时,无法更改语句的 text 属性。但是,如果对要执行的每个不同 SQL 语句使用单独的 SQLStatement 实例,则可以在其他 SQLStatement 实例仍执行的同时调用 SQLStatement 的 execute() 方法,且不会导致错误。

在内部,当您使用异步执行模式执行数据库操作时,每个数据库连接(每个 SQLConnection 实例)都具有自己的队列或指示它执行的操作列表。运行时依次执行每个操作(按照将它们添加到队列的顺序)。创建 SQLStatement 实例并调用其 execute() 方法时,会将该语句执行操作添加到连接队列。如果在该 SQLConnection 实例上当前未执行操作,则语句将在后台开始执行。假定在同一代码块中,创建另一个 SQLStatement 实例,并且也调用该方法的 execute() 方法。该第二个语句执行操作将添加到队列中的第一个语句之后。在第一个语句完成执行后,运行时立即移动到队列中的下一个操作。队列中后续操作的处理发生在后台,即使在主应用程序代码中调度第一个操作的 result 事件也如此。以下代码对此技术进行了演示:

// Using asynchronous execution mode 
var stmt1 = new air.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 = new air.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() 方法的代码放置在该侦听器方法中。