비동기 실행 모드 사용에 대한 한 가지 일반적인 우려는
SQLStatement
인스턴스가 현재 동일한 데이터베이스 연결에 대해 실행되고 있으면 다른 SQLStatement 인스턴스의 실행을 시작할 수 없다는 가정입니다. 사실 이 가정은 올바르지 않습니다. SQLStatement 인스턴스가 실행되는 동안 문의
text
속성을 변경할 수는 없지만, 실행할 다른 SQL 문마다 별도의 SQLStatement 인스턴스를 사용하는 경우 다른 SQLStatement 인스턴스가 실행되는 동안 오류를 발생시키지 않고 SQLStatement의
execute()
메서드를 호출할 수 있습니다.
내부적으로 비동기 실행 모드를 사용하여 데이터베이스 작업을 실행하는 경우 각 데이터베이스 연결(각
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()
메서드를 호출하는 코드는 해당 리스너 메서드 안에 배치됩니다.