Pagination avec IDirectorySearch

La pagination spécifie le nombre de lignes que le serveur retourne au client. Une page peut être définie par le nombre de lignes ou une limite de temps. L’objet COM ADSI récupère chaque page de résultats en fonction des valeurs répertoriées dans le tableau suivant. L’appelant appelle IDirectorySearch::GetNextRow lorsqu’il a atteint la fin de la page et que l’objet COM ADSI récupère la page suivante.

Valeur Description
ADS_SEARCHPREF_PAGESIZE Spécifie le nombre maximal de lignes à retourner dans une page.
ADS_SEARCHPREF_PAGED_TIME_LIMIT Spécifie la durée maximale, en secondes, que le serveur doit consacrer à la collecte d’une page de résultats avant de renvoyer la page au client. Si la limite est atteinte, le serveur arrête la recherche et retourne les lignes déjà récupérées pour la page.

 

Si aucune de ces préférences de recherche n’est définie, la valeur par défaut est aucune pagination. Les recherches dans Active Directory effectuées sans pagination sont limitées à renvoyer un maximum des 1000 premiers enregistrements. Vous devez donc utiliser une recherche paginée s’il est possible que le jeu de résultats contienne plus de 1 000 éléments.

Une opération de recherche peut entraîner le retour d’un grand nombre d’objets. Si le serveur retourne le résultat dans un ensemble, cela peut diminuer les performances du client et du serveur, et affecter la charge réseau. Les recherches paginées peuvent être utilisées pour empêcher cela. Dans une recherche paginée, le client peut accepter les résultats dans des paquets plus petits. La taille d’un paquet est appelée taille de page de recherche.

Les recherches paginées offrent des avantages au client et au serveur. Le client peut être plus réactif dans la présentation des résultats aux utilisateurs. Cela est particulièrement pertinent pour les outils d’interface utilisateur graphique qui peuvent commencer le processus d’affichage de fenêtre pendant que l’autre thread reçoit simultanément les données.

Côté serveur, les recherches paginées rendent l’opération évolutive. Par exemple, si cent clients émettent des demandes de recherche simultanément et, en moyenne, chaque client reçoit deux cents objets. Si aucune taille de page n’est spécifiée, dans le pire des scénarios, le serveur doit disposer d’une mémoire suffisante pour contenir 20 000 objets. À l’inverse, si chaque client spécifie une taille de page pour être, par exemple, dix objets, les besoins en mémoire sur le serveur sont réduits d’un facteur 20.

En outre, à l’aide d’une recherche paginée, un client peut abandonner l’opération en cours. En revanche, dans une recherche non paginée, le client reçoit un jeu de résultats dans un paquet. Cela peut diminuer les performances réseau.

ADSI gère la taille de page du client. Le client n’a pas besoin de compter le nombre d’objets en cours. ADSI encapsule l’interaction serveur pour le client. Du point de vue du client, la recherche retourne un jeu de résultats complet.

Il est recommandé d’utiliser la pagination.

Pour spécifier une taille de page maximale, définissez une option de recherche ADS_SEARCHPREF_PAGESIZE avec une valeur de ADSTYPE_INTEGER définie sur le nombre maximal de lignes par page dans le tableau ADS_SEARCHPREF_INFO passé à la méthode IDirectorySearch::SetSearchPreference .

L’exemple de code suivant montre comment définir la taille maximale de page.

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

Pour spécifier une heure de page, définissez une option de recherche ADS_SEARCHPREF_PAGED_TIME_LIMIT avec une valeur ADSTYPE_INTEGER définie sur le nombre maximal de secondes que le serveur doit consacrer à la récupération d’une page dans le tableau ADS_SEARCHPREF_INFO passée à la méthode IDirectorySearch::SetSearchPreference .

L’exemple de code suivant montre comment spécifier l’heure de la page.

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