Разбиение по страницам с помощью IDirectorySearch
Разбиение по страницам указывает, сколько строк, которые сервер возвращает клиенту. Страницу можно определить по количеству строк или ограничению времени. Объект ADSI COM извлекает каждую страницу результатов на основе значений, перечисленных в следующей таблице. Вызывающий объект вызывает IDirectorySearch::GetNextRow после достижения конца страницы, а объект ADSI COM извлекает следующую страницу.
значение | Описание |
---|---|
ADS_SEARCHPREF_PAGESIZE | Указывает максимальное количество строк, возвращаемых на странице. |
ADS_SEARCHPREF_PAGED_TIME_LIMIT | Указывает максимальное время(в секундах), которое сервер должен тратить на сбор страницы результатов перед возвратом страницы клиенту. Если ограничение достигнуто, сервер останавливает поиск и возвращает строки, уже полученные для страницы. |
Если ни из этих параметров поиска не задано, по умолчанию не выполняется разбиение по страницам. Поиски Active Directory, выполненные без разбиения на страницы, ограничены возвратом не более 1000 записей, поэтому необходимо использовать поиск по страницам, если существует вероятность того, что результирующий набор будет содержать более 1000 элементов.
Операция поиска может привести к большому количеству возвращаемых объектов. Если сервер возвращает результат в одном наборе, он может снизить производительность клиента и сервера, а также повлиять на сетевую нагрузку. Поиск по страницам можно использовать для предотвращения этого. В поиске по страницам клиент может принимать результаты в небольших пакетах. Размер пакета называется размером страницы поиска.
Поиск по страницам предоставляет преимущества как клиенту, так и серверу. Клиент может быть более адаптивным при представлении результатов пользователям. Это особенно важно для графических инструментов пользовательского интерфейса, которые могут начать процесс отображения окна, а другой поток одновременно получает данные.
На стороне сервера поиски на страницах делают операцию масштабируемой. Например, если один сотня клиентов одновременно выдает запросы на поиск и в среднем каждый клиент получает дваста объектов. Если размер страницы не указан, в худшем случае сервер должен иметь достаточную память для хранения 20 000 объектов. И наоборот, если каждый клиент указывает размер страницы, например десять объектов, требование к памяти на сервере, таким образом, уменьшается на 20.
Кроме того, с помощью поиска по страницам клиент может отказаться от операции. Напротив, в нестраничном поиске клиент получает результирующий набор в одном пакете. Это может снизить производительность сети.
ADSI обрабатывает размер страницы для клиента. Клиенту не нужно подсчитывать количество объектов, выполняемых в процессе. ADSI инкапсулирует взаимодействие с сервером для клиента. С точки зрения клиента поиск возвращает полный результирующий набор.
Рекомендуется использовать разбиение по страницам.
Чтобы указать максимальный размер страницы, задайте параметр поиска ADS_SEARCHPREF_PAGESIZE со значением ADSTYPE_INTEGER, равным максимальному количеству строк на страницу в массиве ADS_SEARCHPREF_INFO, переданном методу IDirectorySearch::SetSearchPreference.
В следующем примере кода показано, как задать максимальный размер страницы.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;
Чтобы указать время страницы, задайте параметр поиска ADS_SEARCHPREF_PAGED_TIME_LIMIT со значением ADSTYPE_INTEGER, заданным максимальное количество секунд, которое сервер должен тратить на получение страницы в массиве ADS_SEARCHPREF_INFO, переданном методу IDirectorySearch::SetSearchPreference.
В следующем примере кода показано, как указать время страницы.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGED_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 60;