非同期実行モードについて、同じデータベース接続に対して別の SQLStatement が実行されている場合には
SQLStatement
インスタンスを開始できないと考えている人がよくいますが、それは正しくありません。SQLStatement インスタンスが実行されている間は、そのステートメントの
text
プロパティを変更することはできません。ただし、実行する SQL ステートメントごとに異なる SQLStatement インスタンスを使用すれば、まだ別の SQLStatement インスタンスが実行されている間に SQLStatement の
execute()
メソッドを呼び出すことができます。エラーが発生することもありません。
非同期実行モードを使用してデータベース操作を実行する場合、各データベース接続(各
SQLConnection
インスタンス)に対して固有のキュー(実行するように命令された操作のリスト)が内部で割り当てられます。各操作はそのキューに追加された順に実行されます。SQLStatement インスタンスを作成してその
execute()
メソッドを呼び出すと、そのステートメントの実行操作が接続のキューに追加され、その SQLConnection インスタンスで現在実行されている操作がなければ、バックグラウンドで実行が開始されます。ここで、同じコードブロックの中で別の SQLStatement インスタンスを作成し、その
execute()
メソッドを呼び出したとすると、その 2 つ目のステートメントの実行操作はキューの 1 つ目のステートメントの後に追加されます。1 つ目のステートメントの実行が完了すると、すぐにキューの次の操作が実行されます。キューの次の操作の処理は、まだメインアプリケーションコードで 1 つ目の操作の
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.
このようにキューの次のステートメントを自動的に実行する際には、重要な副作用として、ステートメントが別の操作の結果に依存している場合はその 1 つ目の操作が完了するまでそのステートメントをキューに追加できません(つまり、そのステートメントの
execute()
メソッドを呼び出すことができません)。これは、その 2 つ目のステートメントの
execute()
メソッドを呼び出してしまうと、そのステートメントの
text
プロパティや
parameters
プロパティを変更できなくなるからです。この場合は、1 つ目の操作の完了を知らせるイベントを待ってから次の操作を開始する必要があります。例えば、トランザクションのコンテキストでステートメントを実行する場合は、そのステートメントの実行はトランザクションを開く操作に依存するため、
SQLConnection.begin()
メソッドを呼び出してトランザクションを開いた後、SQLConnection インスタンスの
begin
イベントが送出されるまで待機する必要があります。このイベントが送出されるまでは SQLStatement インスタンスの
execute()
メソッドを呼び出すことはできません。この例で、操作が正常に実行されるようにアプリケーションを構成するには、
begin
イベントのリスナーとして登録されたメソッドを作成するのが最も簡単です。そのリスナーメソッドの中に、
SQLStatement.execute()
メソッドを呼び出すコードを配置します。
|
|
|