IDirectorySearch를 사용하여 페이징
페이징은 서버가 클라이언트로 반환하는 행 수를 지정합니다. 행 수 또는 시간 제한으로 페이지를 정의할 수 있습니다. ADSI COM 개체는 다음 표에 나열된 값에 따라 결과의 각 페이지를 검색합니다. 호출자는 페이지 끝에 도달하면 IDirectorySearch::GetNextRow 를 호출하고 ADSI COM 개체는 다음 페이지를 검색합니다.
값 | Description |
---|---|
ADS_SEARCHPREF_PAGESIZE | 페이지에서 반환할 최대 행 수를 지정합니다. |
ADS_SEARCHPREF_PAGED_TIME_LIMIT | 클라이언트에 페이지를 반환하기 전에 서버에서 결과 페이지를 수집하는 데 소요되는 최대 시간(초)을 지정합니다. 제한에 도달하면 서버는 검색을 중지하고 페이지에 대해 이미 검색된 행을 반환합니다. |
이러한 검색 기본 설정 중 어느 것도 설정되지 않은 경우 기본값은 페이징이 아닙니다. 페이징 없이 수행되는 Active Directory의 검색은 처음 1000개 레코드의 최대값을 반환하는 것으로 제한되므로 결과 집합에 1000개 이상의 항목이 포함될 가능성이 있는 경우 페이징된 검색을 사용해야 합니다.
검색 작업을 수행하면 많은 수의 개체가 반환될 수 있습니다. 서버가 결과를 하나의 집합으로 반환하면 클라이언트 및 서버의 성능이 저하되고 네트워크 부하에 영향을 줄 수 있습니다. 페이징된 검색을 사용하여 이를 방지할 수 있습니다. 페이징된 검색에서 클라이언트는 더 작은 패킷으로 결과를 수락할 수 있습니다. 패킷의 크기를 검색 페이지 크기라고 합니다.
페이징 검색은 클라이언트와 서버 모두에 이점을 제공합니다. 클라이언트는 사용자에게 결과를 표시할 때 응답성이 더 높아질 수 있습니다. 이는 특히 다른 스레드가 동시에 데이터를 수신하는 동안 창 표시 프로세스를 시작할 수 있는 그래픽 사용자 인터페이스 도구와 관련이 있습니다.
서버 쪽에서 페이징된 검색을 통해 작업을 확장할 수 있습니다. 예를 들어 100명의 클라이언트가 동시에 검색 요청을 실행하고 평균적으로 각 클라이언트는 200개의 개체를 수신합니다. 페이지 크기가 지정되지 않은 경우 최악의 경우 서버에 20,000개 개체를 저장할 충분한 메모리가 있어야 합니다. 반대로 각 클라이언트가 10개의 개체와 같은 페이지 크기를 지정하면 서버의 메모리 요구 사항이 20배 감소합니다.
또한 페이징된 검색을 사용하여 클라이언트가 진행 중인 작업을 중단할 수 있습니다. 반면, 페이징이 아닌 검색에서 클라이언트는 하나의 패킷으로 결과 집합을 받습니다. 이렇게 하면 네트워크 성능이 저하됩니다.
ADSI는 클라이언트의 페이지 크기를 처리합니다. 클라이언트는 진행 중인 개체 수를 계산할 필요가 없습니다. ADSI는 클라이언트에 대한 서버 상호 작용을 캡슐화합니다. 클라이언트 관점에서 검색은 전체 결과 집합을 반환합니다.
페이징을 사용하는 것이 좋습니다.
최대 페이지 크기를 지정하려면 ADSTYPE_INTEGER 값이 IDirectorySearch::SetSearchPreference 메서드에 전달된 ADS_SEARCHPREF_INFO 배열의 페이지당 최대 행 수로 설정된 ADS_SEARCHPREF_PAGESIZE 검색 옵션을 설정합니다.
다음 코드 예제에서는 최대 페이지 크기를 설정하는 방법을 보여줍니다.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;
페이지 시간을 지정하려면 ADSTYPE_INTEGER 값이 IDirectorySearch::SetSearchPreference 메서드에 전달된 ADS_SEARCHPREF_INFO 배열의 페이지를 검색하는 데 소비해야 하는 최대 시간(초)으로 설정된 ADS_SEARCHPREF_PAGED_TIME_LIMIT 검색 옵션을 설정합니다.
다음 코드 예제에서는 페이지 시간을 지정하는 방법을 보여줍니다.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGED_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 60;