使用 IDirectorySearch 分页

分页指定服务器返回到客户端的行数。 页面可以通过行数或时间限制来定义。 ADSI COM 对象根据下表列出的值来检索每页结果。 调用方在到达页尾时调用 IDirectorySearch::GetNextRow,并且 ADSI COM 对象会检索下一页。

说明
ADS_SEARCHPREF_PAGESIZE 指定页面中要返回的最大行数。
ADS_SEARCHPREF_PAGED_TIME_LIMIT 指定服务器在向客户端返回页面之前用于收集结果页面的最长时间(以秒为单位)。 如果达到限制,服务器将停止搜索,并返回已为页面检索的行。

 

如果这两个搜索首选项都未设置,则默认为不分页。 在不进行分页的情况下执行的 Active Directory 搜索最多只能返回前 1000 条记录,因此,如果结果集可能包含超过 1000 个项目,则必须使用分页搜索。

搜索操作可能会导致返回大量对象。 如果服务器只返回一组结果,则可能会降低客户端和服务器的性能,并影响网络负载。 可以使用分页搜索来避免这种情况。 在分页搜索中,客户端可以接受较小数据包中的结果。 数据包的大小称为搜索页大小。

分页搜索对客户端和服务器都有好处。 客户端在向用户展示结果时可以更加迅速。 这与图形用户界面工具尤为相关,因为这些工具可以在另一个线程同时接收数据的情况下开始窗口显示过程。

在服务器端,分页搜索使操作具有可扩展性。 例如,如果一百个客户端同时发出搜索请求,平均每个客户端接收两百个对象。 如果未指定页面大小,在最坏的情况下,服务器必须有足够的内存来容纳 20,000 个对象。 相反,如果每个客户端指定的页面大小为 10 个对象,则服务器的内存需求就会减少 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;

要指定页面时间,请在传给 IDirectorySearch::SetSearchPreference 方法的 ADS_SEARCHPREF_INFO 数组中设置 ADS_SEARCHPREF_PAGED_TIME_LIMIT 搜索选项,并将 ADSTYPE_INTEGER 值设置为服务器检索页面时应花费的最长秒数。

下面的代码示例显示了如何指定页面时间。

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