IDirectorySearchを使用したページング

ページングは、サーバーがクライアントに返す行数を指定します。 ページは、行数または時間制限によって定義できます。 ADSI COMオブジェクトは、次の表に示す値に基づいて結果の各ページを取得します。 呼び出し元は、ページの末尾に到達するとIDirectorySearch::GetNextRowを呼び出し、ADSI COMオブジェクトは次のページを取得します。

Value 説明
ADS_SEARCHPREF_PAGESIZE 1ページで返す行の最大数を指定します。
ADS_SEARCHPREF_PAGED_TIME_LIMIT 結果ページをクライアントに返す前に、サーバーが結果ページの収集に費やす最大時間を秒単位で指定します。 制限に達すると、サーバーは検索を停止し、そのページ用に既に取得された行を返します。

 

どちらの検索設定も設定されていない場合、既定値はページングなしです。 ページングなしで実行されるActive Directoryの検索は、最大で最初の1000レコードを返すように制限されているため、結果セットに1000を超える項目が含まれる可能性がある場合は、ページング検索を使用する必要があります。

検索操作によって、多数のオブジェクトが返される可能性があります。 サーバーが結果を1つのセットで返すと、クライアントとサーバーのパフォーマンスが低下し、ネットワークの負荷に影響する可能性があります。 ページング検索を使用すると、これを防ぐことができます。 ページング検索では、クライアントはより小さなパケットで結果を受け取ることができます。 パケットのサイズは、検索ページサイズと呼ばれます。

ページング検索は、クライアントとサーバーの両方に利点を提供します。 クライアントは、ユーザーに結果を表示する際に応答性を高めることができます。 これは、他のスレッドが同時にデータを受信している間にウィンドウ表示プロセスを開始できるグラフィカルユーザーインターフェイスツールに特に関連しています。

サーバー側では、ページング検索によって操作がスケーラブルになります。 たとえば、100のクライアントが同時に検索要求を発行し、各クライアントが平均で200個のオブジェクトを受信するとします。 ページサイズが指定されていない場合、最悪のシナリオでは、サーバーに2万個のオブジェクトを保持するのに十分なメモリが必要です。 逆に、各クライアントが10個のオブジェクトなどのページサイズを指定した場合、サーバーのメモリ要件は20倍に減少します。

また、ページ検索を使用すると、クライアントは進行中の操作を破棄できます。 これに対し、非ページ検索では、クライアントは結果セットを単一のパケットで受信します。 これにより、ネットワークパフォーマンスが低下する可能性があります。

ADSIは、クライアントのページサイズを処理します。 クライアントは、進行中のオブジェクトの数をカウントする必要はありません。 ADSIは、クライアントのサーバーとの対話をカプセル化します。 クライアントの観点からは、検索によって完全な結果セットが返されます。

ページングを使用することをお勧めします。

最大ページサイズを指定するには、ADSTYPE_INTEGER 値をIDirectorySearch::SetSearchPreferenceメソッドに渡されるADS_SEARCHPREF_INFO配列内のページあたりの最大行数に設定した ADS_SEARCHPREF_PAGESIZE 検索オプションを設定します。

次のコード例は、最大ページサイズを設定する方法を示しています。

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;

ページ時間を指定するには、ADSTYPE_INTEGER値をIDirectorySearch::SetSearchPreferenceメソッドに渡されるADS_SEARCHPREF_INFO配列内のページの取得にサーバーが費やす最大秒数に設定したADS_SEARCHPREF_PAGED_TIME_LIMIT検索オプションを設定します。

次のコード例は、ページ時間を指定する方法を示しています。

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGED_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 60;