1

現在 ISAPI に変換中の Win-CGI アプリケーションがあります。

アプリケーションは、Extended Systems Advantage データベース サーバーの TDataset の子孫を使用します。

TAdsSettings オブジェクトのインスタンスは 1 つしか存在できないため、これはメイン スレッドにある必要があります。

要求スレッドには TAdsQuery オブジェクトが必要です。

これは機能しますか?つまり、リクエスト スレッドの AdsQueries は、メイン スレッドの AdsSettings オブジェクトからグローバル設定を取得しますか?これはスレッド セーフになりますか?

4

3 に答える 3

1

はい、うまくいきます。TAdsSettings コンポーネントは Advantage Client Engine (ACE) の設定を変更します。ISAPI を使用すると、すべてのスレッドが使用する ACE の 1 つのインスタンスが読み込まれます。

ただし、お勧めしません。変更する設定によっては、ACE API を直接呼び出す方が理にかなっています。たとえば、日付形式のみを設定する場合は、TAdsSettings コンポーネントを削除して、接続ハンドルを受け取る AdsSetDateFormat60 だけを呼び出す方が理にかなっています。TAdsSettings コンポーネントを取り除くことで、ACE グローバル設定を設定するための多くの呼び出しがなくなります。これらの呼び出しの多くには、グローバルが変更されている間、すべての接続をオフにする同期オブジェクトが必要です。これは、特に Web アプリケーションのようなマルチスレッド アプリケーションでは、パフォーマンスに悪影響を及ぼします。代わりに、指定された接続ハンドルで動作する呼び出しを行います。

接続ハンドルを取得するには、TAdsConnection.Handle プロパティを参照するか、TAdsQuery.GetAceConnectionHandle メソッドを呼び出します。

于 2008-09-18T19:25:52.463 に答える
0

メイン スレッドにない場合 (つまりSystem.MainThreadID <> Windows.GetCurrentThreadID

于 2008-09-18T17:08:16.693 に答える
0

ニュースグループでも次の質問をしました: devzone.advantagedatabase.com, Advantage.Delphi

完全を期すために、そのスレッドの残りの部分からさらに質問/回答を追加します。

私に尋ねてください):

現在、スレッド内のクエリの多くは、TAdsConnection オブジェクトに関連付けられていません。これらの「孤立した」クエリを使用するためにスレッドごとに接続を作成する予定ですが、これは大規模なアプリケーションであり、これには時間がかかります。また、TAdsSettings オブジェクトの唯一の非デフォルト プロパティはサーバー タイプ セットであり、これは接続コンポーネントでも設定できると確信しています。したがって、すべてのクエリが接続にリンクされると、設定コンポーネントは必要なくなります。代わりに、設定 API を直接呼び出すことを検討します。

それまでの間、スレッド化と、接続コンポーネントが割り当てられていないクエリについて質問があります。複数のスレッドのクエリが 1 つの接続オブジェクトを共有する場合、クエリは同時にではなく連続して実行されることをヘルプ ファイルから指摘しました。各スレッドに接続オブジェクトがある場合、これは問題になりませんが、接続オブジェクトが割り当てられていないクエリについて疑問に思っています。マルチスレッドの同時実行性の観点から、それらは独立した接続上にあると見なされますか、それとも同じ接続上にあると見なされ、互いに譲歩する必要がありますか?

回答 (ジェレミー):

これに対処する必要があります。接続のグローバル リストを検索して、同じパスを持つ接続を見つけるだけで、その接続を使用します。マルチスレッド アプリケーションでは不向きです。

したがって、Jeremy の回答から、スレッドごとに少なくとも 1 つの TAdsConnection オブジェクトを作成し、すべてのクエリがそれにアタッチされていることを確認するのが最善です。そうしないと、シリアル化が発生する可能性があります。

于 2008-11-19T11:33:26.910 に答える