複数セッションの管理
メモ: ボーランド データベース エンジン(BDE)の使用は推奨されません。今後 BDE は機能拡張されません。たとえば、BDE では Unicode がサポートされていません。BDE を使用して新たに開発しないことをお勧めします。既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。
データベース処理を実行する複数のスレッドを使用する単独のアプリケーションを作成する場合、スレッドごとに追加セッションを 1 つ作成しなければなりません。ツールパレットの[BDE]カテゴリには、設計時にデータモジュールまたはフォームに追加できるセッションコンポーネントがあります。
警告: セッションコンポーネントを追加する場合、デフォルトセッションの SessionName プロパティと衝突しないように、ユニークな値を SessionName プロパティに設定する必要もあります。
設計時に TSession コンポーネントを入れると、実行時にアプリケーションに必要になるスレッド(および、それによるセッション)の数が静的であると仮定されます。しかし、アプリケーションがセッションを動的に作成しなければならないことがよくあります。セッションを動的に作成するには,実行時にグローバルオブジェクト Bde.DBTables.Sessions の OpenSession メソッドを呼び出します。
OpenSession には、アプリケーションのすべてのセッション名でユニークなセッション名のパラメータが 1 つ必要です。次のコードは、ユニークに生成される名前を持つ新しいセッションを動的に作成してアクティブにします。
Sessions.OpenSession('RunTimeSession' + IntToStr(Sessions.Count + 1));
Sessions->OpenSession("RunTimeSession" + IntToStr(Sessions->Count + 1));
この文では、現在のセッション数を取り出して、その値に 1 を足すことによって、新しいセッションのユニークな名前を生成しています。実行時にセッションを動的に作成して破棄する場合、このコード例は期待どおりに動作しないことに注意してください。この例は、複数のセッションを管理するために Sessions のプロパティとメソッドをどう使用するかを示したものです。
Sessions は TSessionList 型の変数で、BDE ベースのデータベースアプリケーション用に自動的にインスタンス化されます。Sessions のプロパティとメソッドを使ってマルチスレッドデータベースアプリケーション内の複数のセッションを管理します。TSessionList コンポーネントのプロパティとメソッドの概要を次の表に示します。
TSessionList のプロパティとメソッド :
プロパティ/メソッド | 用途 |
---|---|
Count |
セッションリスト内のセッション数(アクティブと非アクティブの両方)を返す |
FindSession |
指定された名前のセッションを検索し、そのセッションを指すポインタを返す。指定された名前のセッションがない場合は nil を返す。空白のセッション名を渡した場合は、デフォルトセッション Session を返す。 |
GetSessionNames |
現在インスタンス化されているすべてのセッションコンポーネントの名前の文字列リストを返す。最低でも 1 つの文字列(デフォルトセッションの「Default」)が必ず追加される。 |
List |
指定されたセッション名のセッションコンポーネントを返す。その名前のセッションがない場合、例外が生成される |
OpenSession |
指定されたセッション名で新しいセッションを作成してアクティブにするか、その名前の既存のセッションを再びアクティブにする |
Sessions |
順序値でセッションリストにアクセスする |
マルチスレッドアプリケーションでの Sessions のプロパティとメソッドの例として、データベース接続を開くときの動作について考えます。接続がすでに存在するかどうかを確認するには、Sessions プロパティを使用して、セッションリストにある各セッションをデフォルトセッションから順にたどっていきます。セッションコンポーネントごとに、Databases プロパティを調べて、問題のデータベースが開いているかを確認します。必要なデータベースをすでにほかのスレッドが使用している場合、リスト内の次のセッションを調べます。
既存のスレッドがデータベースを使用していない場合、そのセッション内で接続を開けます。
一方、既存のすべてのスレッドがデータベースを使用している場合は、別のデータベース接続を開くための新しいセッションを開かなければなりません。
それぞれのスレッドがデータモジュールの独自のコピーを含むマルチスレッドアプリケーション内の 1 つのセッションを含むデータモジュールをレプリケートする場合は、AutoSessionName プロパティを使ってデータモジュール内のすべてのデータセットが確実に正しいセッションを使用するようにすることができます。AutoSessionName を True に設定すると、実行時に作成されるときにそれ自体のユニークな名前が動的に生成されます。次にこの名前がデータモジュール内のすべてのデータセットに割り当てられ、明示的に設定されたセッション名がすべてオーバーライドされます。これにより、それぞれのスレッドがそれ自身のセッションを持ち、それぞれのデータセットがそれ自身のデータモジュールの中のセッションを確実に使用できます。