Paging con IDirectorySearch
Il paging specifica il numero di righe restituite dal server al client. Una pagina può essere definita dal numero di righe o da un limite di tempo. L'oggetto COM ADSI recupera ogni pagina di risultati in base ai valori elencati nella tabella seguente. Il chiamante chiama IDirectorySearch::GetNextRow quando ha raggiunto la fine della pagina e l'oggetto COM ADSI recupera la pagina successiva.
Valore | Descrizione |
---|---|
ADS_edizione StandardARCHPREF_PAGESIZE | Specifica il numero massimo di righe da restituire in una pagina. |
ADS_edizione StandardARCHPREF_PAGED_TIME_LIMIT | Specifica il tempo massimo, espresso in secondi, che il server deve dedicare la raccolta di una pagina di risultati prima di restituire la pagina al client. Se viene raggiunto il limite, il server arresta la ricerca e restituisce le righe già recuperate per la pagina. |
Se nessuna di queste preferenze di ricerca è impostata, il valore predefinito non è paging. Le ricerche di Active Directory eseguite senza paging sono limitate alla restituzione di un massimo dei primi 1000 record, pertanto è necessario usare una ricerca in pagina se è possibile che il set di risultati contenga più di 1000 elementi.
Un'operazione di ricerca può comportare la restituzione di un numero elevato di oggetti. Se il server restituisce il risultato in un unico set, potrebbe ridurre le prestazioni del client e del server, nonché influire sul carico di rete. Le ricerche in pagine possono essere usate per evitare questo problema. In una ricerca con paging, il client può accettare i risultati in pacchetti più piccoli. Le dimensioni di un pacchetto sono note come dimensioni della pagina di ricerca.
Le ricerche con paging offrono vantaggi sia al client che al server. Il client può essere più reattivo nella presentazione dei risultati agli utenti. Ciò è particolarmente rilevante per gli strumenti dell'interfaccia utente grafica che possono avviare il processo di visualizzazione della finestra mentre l'altro thread riceve i dati contemporaneamente.
Sul lato server le ricerche con paging rendono l'operazione scalabile. Ad esempio, se cento client eseguono contemporaneamente richieste di ricerca e, in media, ogni client riceve 200 oggetti. Se non viene specificata alcuna dimensione della pagina, nello scenario peggiore, il server deve disporre di memoria sufficiente per contenere 20.000 oggetti. Viceversa, se ogni client specifica una dimensione di pagina, ad esempio dieci oggetti, il requisito di memoria nel server viene quindi ridotto di un fattore pari a 20.
Inoltre, usando una ricerca con paging, un client può abbandonare l'operazione in corso. Al contrario, in una ricerca non di paging, il client riceve un set di risultati in un pacchetto. Ciò può ridurre le prestazioni di rete.
ADSI gestisce le dimensioni della pagina per il client. Il client non deve contare il numero di oggetti in corso. ADSI incapsula l'interazione del server per il client. Dal punto di vista del client, la ricerca restituisce un set di risultati completo.
È consigliabile usare il paging.
Per specificare una dimensione massima della pagina, impostare un'opzione di ricerca ADS_edizione StandardARCHPREF_PAGESIZE con un valore ADSTYPE_INTEGER impostato sul numero massimo di righe per pagina nella matrice ADS_edizione StandardARCHPREF_INFO passato al metodo IDirectorySearch::SetSearchPreference.
Nell'esempio di codice seguente viene illustrato come impostare le dimensioni massime della pagina.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;
Per specificare un'ora di pagina, impostare un'opzione di ricerca ADS_edizione StandardARCHPREF_PAGED_TIME_LIMIT con un valore ADSTYPE_INTEGER impostato sul numero massimo di secondi che il server deve dedicare a recuperare una pagina nella matrice ADS_edizione StandardARCHPREF_INFO passata al metodo IDirectorySearch::SetSearchPreference.
Nell'esempio di codice seguente viene illustrato come specificare l'ora della pagina.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGED_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 60;