Paginación con IDirectorySearch
La paginación especifica cuántas filas devuelve el servidor al cliente. Una página se puede definir mediante el número de filas o un límite de tiempo. El objeto COM ADSI recupera cada página de resultados en función de los valores enumerados en la tabla siguiente. El autor de la llamada llama a IDirectorySearch::GetNextRow cuando ha llegado al final de la página y el objeto COM ADSI recupera la página siguiente.
Valor | Descripción |
---|---|
ADS_SEARCHPREF_PAGESIZE | Especifica el número máximo de filas que se van a devolver en una página. |
ADS_SEARCHPREF_PAGED_TIME_LIMIT | Especifica el tiempo máximo, en segundos, que el servidor debe dedicar a recopilar una página de resultados antes de devolver la página al cliente. Si se alcanza el límite, el servidor detiene la búsqueda y devuelve las filas ya recuperadas para la página. |
Si no se establece ninguna de estas preferencias de búsqueda, el valor predeterminado no es la paginación. Las búsquedas de Active Directory realizadas sin paginación se limitan a devolver un máximo de los primeros 1000 registros, por lo que debe usar una búsqueda paginada si existe la posibilidad de que el conjunto de resultados contenga más de 1000 elementos.
Una operación de búsqueda puede dar lugar a un gran número de objetos que se devuelven. Si el servidor devuelve el resultado en un conjunto, podría reducir el rendimiento del cliente y el servidor, así como afectar a la carga de red. Las búsquedas paginadas se pueden usar para evitar esto. En una búsqueda paginada, el cliente puede aceptar resultados en paquetes más pequeños. El tamaño de un paquete se conoce como tamaño de página de búsqueda.
Las búsquedas paginadas ofrecen ventajas tanto para el cliente como para el servidor. El cliente puede tener mayor capacidad de respuesta al presentar los resultados a los usuarios. Esto es especialmente relevante para las herramientas gráficas de la interfaz de usuario que pueden comenzar el proceso de visualización de la ventana, mientras que el otro subproceso recibe simultáneamente los datos.
En el lado servidor, las búsquedas paginadas hacen que la operación sea escalable. Por ejemplo, si un centenar de clientes emiten solicitudes de búsqueda simultáneamente y, en promedio, cada cliente recibe doscientos objetos. Si no se especifica ningún tamaño de página, en el peor de los casos, el servidor debe tener suficiente memoria para contener 20 000 objetos. Por el contrario, si cada cliente especifica un tamaño de página que va a ser, por ejemplo, diez objetos, el requisito de memoria en el servidor se reduce así en un factor de 20.
Además, mediante una búsqueda paginada, un cliente puede abandonar la operación en curso. En cambio, en una búsqueda no paginada, el cliente recibe un conjunto de resultados en un paquete. Esto puede reducir el rendimiento de la red.
ADSI controla el tamaño de página del cliente. El cliente no tiene que contar el número de objetos en curso. ADSI encapsula la interacción del servidor para el cliente. Desde la perspectiva del cliente, la búsqueda devuelve un conjunto de resultados completo.
Se recomienda usar la paginación.
Para especificar un tamaño máximo de página, establezca una opción de búsqueda ADS_SEARCHPREF_PAGESIZE con un valor de ADSTYPE_INTEGER establecido en el número máximo de filas por página de la matriz ADS_SEARCHPREF_INFO pasada al método IDirectorySearch::SetSearchPreference .
En el ejemplo de código siguiente se muestra cómo establecer el tamaño máximo de página.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;
Para especificar una hora de página, establezca una opción de búsqueda ADS_SEARCHPREF_PAGED_TIME_LIMIT con un valor de ADSTYPE_INTEGER establecido en el número máximo de segundos que el servidor debe dedicar a recuperar una página de la matriz ADS_SEARCHPREF_INFO pasada al método IDirectorySearch::SetSearchPreference .
En el ejemplo de código siguiente se muestra cómo especificar la hora de la página.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGED_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 60;