データベース コントロールの設計の問題
このトピックでは、新しいデータベース コントロールを作成する際に考慮すべき設計の問題について説明します。
データベース コントロールの詳細については、データベース コントロール : Web サービスからデータベースを使用するを参照してください。
新しいデータベース コントロールを設計する場合、同じデータベースに対して複数のデータベース コントロールを作成してもかまいません。一般に、データベースとの対話はいくつかのカテゴリに分類されます。
管理者操作 :データベース テーブルに対する CREATE や DROP 処理などがあります。
特権操作 :INSERT や UPDATE 処理などがあります。多くのアプリケーションでは、データベースの内容の変更を許可するユーザまたはアプリケーションを制限しています。
取得操作 :SELECT 処理が一般的です。通常、データベースの内容の変更を伴わない操作は、さまざまな種類のユーザが実行できます。
アプリケーションのユーザを上記のようなグループに区分できる場合、ユーザの種類ごとに別々のデータベース コントロールを作成すると便利です。この方法で、管理アクセスを必要としない Web サービスの開発者に対して限定的な特権操作のみを公開することができます。
ただし、データベースの管理作業はアプリケーションのデプロイメントの一環として実行されるのが一般的です。通常、プロダクション環境では、テーブル作成などの管理作業への Web サービスのインタフェースに関する要件はありません。WebLogic Workshop 付属のデータベース コントロールのサンプルには、良い設計例というよりも、便利なサンプルとしてテーブル作成メソッドが含まれています。
データベース コントロールのデータベース処理を設計する場合、処理によって返される結果セットのサイズに注意する必要があります。データベースが大きな場合、マシンで使用可能なメモリ量を超える結果セットを返すクエリはまれではありません。
結果セットが大きいことによるメモリ不足エラーを防ぐには、次のような方法があります。
クエリによって返されるカラムの数を必要な数に制限する。必要な場合を除いて、「SELECT *」文を使用しないようにします。
データベースでフィルタ処理を実行する。クエリで返されるレコードのサブセットのみを処理したい場合、データベース システムがフィルタ処理するようにクエリを修正します。データベース システムはこうした処理向けに最適化されており、メモリ使用量の少ないフィルタ処理やソート処理を実行するように設計されています。
array-max-length 属性を使用して配列のサイズを制限する。データベース コントロール メソッドが配列を返す場合、そのメソッドの @jws:sql タグに array-max-length 属性を明示的に指定する必要があります。返される行の数よりも大きく、かつ行数が大きすぎてメモリが不足することのないような値を設定します。クエリによって配列サイズの制限値に達した場合、制限を超えたために削除された行を後で返す方法がないことに注意してください。また、API 呼び出しを使用して array-max-length を設定する方法もありません。
array-max-length のデフォルト値は 1024 です。
イテレータを使用する。データベース コントロールは、配列の代わりに java.util.Iterator を返すことができます。イテレータは、データベースに効率的にアクセスする java.sql.ResultSet オブジェクトをラップします。データベース コントロール メソッドを呼び出すことでイテレータを取得した Web サービスはイテレータをステップ処理するので、イテレータと ResultSet は、次のデータを取得するためのリクエストを必要に応じてデータベースに送ります。この方法により、使用可能なメモリ量よりも大きな結果セットを処理することができます。
複数の行を返すデータベース コントロール メソッドの記述方法については、データベース コントロール メソッドから複数の行を返すを参照してください。
データベース コントロールを設計する場合、他のコントロールや Web サービスを設計する場合と同じように、コントロールのユーザにどのような情報が必要となるかを十分に検討します。Web サービスの開発者にとって便利な処理とデータ構造を選択します。
この目的を達成する 1 つの方法は、データベース コントロール メソッドの処理対象となるレコードまたは一部の行を表す Java クラスを提供することです。データベース コントロールのインタフェースで常にこうしたクラスを使用すると、データベース コントロールが使いやすくなります。
データベース コントロール メソッドからデータを返す方法についてのトピックで説明したように、データベース フィールドが NULL の場合に返される値は、データベース フィールドを変換する Java の型によって異なります。int や float などの Java プリミティブは、NULL 値を表すことができないので、必ず有効な値を持たなければなりません。したがって、値を持たないデータベース フィールドを int に変換した場合、値は 0 となります。データベース コントロールの開発者またはクライアントがゼロと NULL を区別したい場合、基本的な型の Java ラッパー クラスを使用する必要があります。たとえば、int の代わりに java.lang.Integer を、float の代わりに java.lang.Float を使用します。
データベース コントロールにはできる限り柔軟性を持たせます。
たとえば、クエリに値をハードコード化しないようにします。コントロールのユーザの利便性を維持しつつ、データベース処理をできる限りパラメータで表します。一般に、処理は特定のテーブルを対象としているので、テーブル名はハードコード化した方が便利です。また、日付や時刻をクエリにハードコード化することはお勧めしません。