SQL データベースの操作のための戦略

Adobe AIR 1.0 およびそれ以降

アプリケーションでローカル SQL データベースにアクセスして操作するには様々な方法があります。アプリケーションコードの構成や、操作を実行する順序やタイミングなどは、アプリケーションの設計によって様々です。選択する方法によって、アプリケーションの開発の容易さや、将来の更新でアプリケーションに変更を加えるときの容易さ、ユーザーから見たアプリケーションのパフォーマンスなどが違ってきます。

設定済みデータベースの配布

アプリケーションで AIR ローカル SQL データベースを使用する際には、テーブルや列などの特定の構造がデータベースに含まれている必要があります。さらに、アプリケーションによっては、データベースファイルに特定のデータがあらかじめ設定されている必要がある場合もあります。データベースに適切な構造が含まれるようにするには、まず、アプリケーションコードでデータベースを作成するという方法があります。データベースファイルが特定の場所にあるかどうかをアプリケーションの読み込み時にチェックして、ファイルが存在しない場合には一連のコマンドを実行してデータベースファイルを作成し、データベース構造を作成し、テーブルに初期データを設定します。

データベースとそのテーブルを作成するコードは複雑になることが多く、たいていはアプリケーションがインストールされている期間に 1 回しか使用されないにもかかわらず、アプリケーションのサイズと複雑さを増加させる要因になります。データベース、構造およびデータをプログラムで作成する代わりに、設定済みのデータベースをアプリケーションと一緒に配布することもできます。そのためには、データベースファイルをアプリケーションの AIR パッケージに含めます。

同梱されたデータベースファイルは、AIR パッケージに含まれているすべてのファイルと同様に、アプリケーションディレクトリ(File.applicationDirectory プロパティによって表されるディレクトリ)にインストールされます。ただし、このディレクトリのファイルは読み取り専用であるため、AIR パッケージのファイルを「テンプレート」データベースとして使用して、ユーザーが初めてアプリケーションを実行したときに元のデータベースファイルをユーザーのアプリケーション記憶領域ディレクトリの参照(または別の場所)にコピーし、そのデータベースをアプリケーション内で使用します。

ローカル SQL データベースの操作のベストプラクティス

ローカル SQL データベースを使用する際には、アプリケーションのパフォーマンス、セキュリティおよびメンテナンス性を向上させるために以下のテクニックを使用することをお勧めします。

データベース接続を事前に作成する

アプリケーションの最初の読み込み時に実行するステートメントがなくても、ステートメントの実行時に遅れが生じないように、事前に(アプリケーションの起動後など)SQLConnection オブジェクトをインスタンス化してその open() メソッドまたは openAsync() メソッドを呼び出します。データベースへの接続を参照してください。

データベース接続を再利用する

アプリケーションの実行期間全体にわたってアクセスするデータベースがある場合は、接続を閉じたり開いたりする代わりに、SQLConnection インスタンスへの参照を保持してアプリケーション全体で再利用します。データベースへの接続を参照してください。

非同期実行モードを優先的に使用する

データアクセスコードを記述する際には、同期操作を使用した方がコードが短く単純になることが多いため、操作を非同期ではなく同期的に実行したくなるかもしれませんが、同期および非同期のデータベース操作の使用で説明したように、同期操作はユーザーの体感的なパフォーマンスに影響を与え、アプリケーションのユーザーエクスペリエンスを低下させる可能性があります。1 つの操作にかかる時間は操作(特に、操作に含まれるデータの量)によって変わります。例えば、データベースにデータを 1 行だけ追加する SQL INSERT ステートメントにかかる時間は、数千行のデータを取得する SELECT ステートメントより短くなります。しかし、同期実行を使用して複数の操作を実行すると、通常はそれらの操作が一続きで実行されます。1 つ 1 つの操作にかかる時間は非常に短くても、すべての同期操作が完了するまでアプリケーションが応答しなくなります。その結果、一続きで実行される複数の操作の時間が累積されて、アプリケーションの動作が停止する場合もあります。

非同期操作を標準のアプローチとして使用します。多数の行を含む操作では特にそうするようにしてください。SELECT ステートメントの結果が大きい場合にその処理を分割する方法もありますが(SELECT の結果の分割を参照)、非同期実行モードでしか使用できません。同期操作を使用するのは、非同期プログラミングでは実現できない機能がある場合のみにしてください。その場合も、アプリケーションのユーザーへのパフォーマンスの影響を考慮し、アプリケーションをテストしてアプリケーションのパフォーマンスへの影響を確認する必要があります。非同期実行を使用するとコードが複雑になる場合もありますが、コードを記述するのは 1 回だけで済むのに対し、アプリケーションのユーザーはそれを(速くても遅くても)繰り返し使用しなければならないことを忘れないでください。

多くの場合は、実行する SQL ステートメントごとに個別の SQLStatement インスタンスを使用することで、複数の SQL 操作を一度にキューに登録できます。これにより、非同期コードを同期コードのように記述することができます。詳しくは、非同期実行モデルについてを参照してください。

SQLStatement の text プロパティを変更せずに別の SQL ステートメントを使用する

アプリケーション内で複数回実行される SQL ステートメントがある場合は、SQL ステートメントごとに個別の SQLStatement インスタンスを作成し、その SQL コマンドを実行するたびにその SQLStatement インスタンスを使用します。例えば、作成するアプリケーションに何度も実行される 4 つの異なる SQL 操作が含まれている場合は、4 つの SQLStatement インスタンスを作成し、各ステートメントの execute() メソッドを呼び出してステートメントを実行します。すべての SQL ステートメントに対して 1 つの SQLStatement インスタンスを使用し、ステートメントを実行する前に毎回その text プロパティを再定義するという方法は避けてください。

ステートメントパラメーターを使用する

ユーザー入力をステートメントテキストに連結する代わりに SQLStatement のパラメーターを使用します。パラメーターを使用すると、SQL インジェクション攻撃が行われる可能性がなくなるため、アプリケーションのセキュリティが向上します。クエリで(SQL リテラル値だけでなく)オブジェクトを使用できるようにもなります。さらに、ステートメントを実行のたびに再コンパイルせずに再利用できるため、実行効率も向上します。詳しくは、ステートメント内でのパラメーターの使用を参照してください。