Paging mit IDirectorySearch

Paging gibt an, wie viele Zeilen der Server an den Client zurückgibt. Eine Seite kann durch die Anzahl von Zeilen oder ein Zeitlimit definiert werden. Das ADSI COM-Objekt ruft jede Ergebnisseite basierend auf den in der folgenden Tabelle aufgeführten Werten ab. Der Aufrufer ruft IDirectorySearch::GetNextRow auf, wenn er das Seitenende erreicht hat, und das ADSI COM-Objekt ruft die nächste Seite ab.

Wert Beschreibung
ADS_SEARCHPREF_PAGESIZE Gibt die maximale Anzahl von Zeilen an, die auf einer Seite zurückgegeben werden sollen.
ADS_SEARCHPREF_PAGED_TIME_LIMIT Gibt die maximale Zeit in Sekunden an, die der Server damit verbringen soll, eine Seite mit Ergebnissen zu sammeln, bevor die Seite an den Client zurückgegeben wird. Wenn der Grenzwert erreicht ist, beendet der Server die Suche und gibt die zeilen zurück, die bereits für die Seite abgerufen wurden.

 

Wenn keine dieser Sucheinstellungen festgelegt ist, ist der Standardwert kein Paging. Suchen von Active Directory, die ohne Paging ausgeführt werden, sind auf die Rückgabe von maximal 1.000 Datensätzen beschränkt. Daher müssen Sie eine ausgelagerte Suche verwenden, wenn die Möglichkeit besteht, dass das Resultset mehr als 1000 Elemente enthält.

Ein Suchvorgang kann dazu führen, dass eine große Anzahl von Objekten zurückgegeben wird. Wenn der Server das Ergebnis in einem Satz zurückgibt, kann dies die Leistung des Clients und Servers verringern und die Netzwerklast beeinträchtigen. Mit seitenseitigen Suchvorgängen kann dies verhindert werden. Bei einer seitenseitigen Suche kann der Client ergebnisse in kleineren Paketen akzeptieren. Die Größe eines Pakets wird als Suchseitengröße bezeichnet.

Ausgelagerte Suchvorgänge bieten Sowohl für den Client als auch für den Server Vorteile. Der Client kann bei der Präsentation der Ergebnisse für Benutzer reaktionsfähiger sein. Dies ist insbesondere für grafische Benutzeroberflächentools relevant, die den Fensteranzeigeprozess starten können, während der andere Thread die Daten gleichzeitig empfängt.

Auf der Serverseite sorgen seitenseitige Suchvorgänge dafür, dass der Vorgang skalierbar ist. Wenn beispielsweise hundert Clients gleichzeitig Suchanforderungen ausgeben und im Durchschnitt jeder Client zweihundert Objekte empfängt. Wenn keine Seitengröße angegeben wird, muss der Server im schlimmsten Fall über genügend Arbeitsspeicher verfügen, um 20.000 Objekte aufnehmen zu können. Wenn hingegen jeder Client eine Seitengröße angibt, die z. B. zehn Objekte beträgt, wird der Arbeitsspeicherbedarf auf dem Server um den Faktor 20 reduziert.

Darüber hinaus kann ein Client mithilfe einer seitenseitigen Suche den laufenden Vorgang abbrechen. Im Gegensatz dazu empfängt der Client bei einer nicht ausgelagerten Suche ein Resultset in einem Paket. Dies kann die Netzwerkleistung beeinträchtigen.

ADSI verarbeitet die Seitengröße für den Client. Der Client muss nicht die Anzahl der objekte zählen, die in Bearbeitung sind. ADSI kapselt die Serverinteraktion für den Client. Aus Sicht des Clients gibt die Suche ein vollständiges Resultset zurück.

Es wird empfohlen, paging zu verwenden.

Um eine maximale Seitengröße anzugeben, legen Sie eine ADS_SEARCHPREF_PAGESIZE Suchoption mit einem ADSTYPE_INTEGER Wert fest, der auf die maximale Anzahl von Zeilen pro Seite im ADS_SEARCHPREF_INFO Array festgelegt ist, das an die IDirectorySearch::SetSearchPreference-Methode übergeben wird.

Im folgenden Codebeispiel wird gezeigt, wie die maximale Seitengröße festgelegt wird.

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

Um eine Seitenzeit anzugeben, legen Sie eine ADS_SEARCHPREF_PAGED_TIME_LIMIT Suchoption mit einem ADSTYPE_INTEGER Wert auf die maximale Anzahl von Sekunden fest, die der Server zum Abrufen einer Seite im ADS_SEARCHPREF_INFO Arrays aufwenden soll, das an die IDirectorySearch::SetSearchPreference-Methode übergeben wird.

Im folgenden Codebeispiel wird gezeigt, wie die Seitenzeit angegeben wird.

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