문제

제품 목록을 반환하는 웹 서비스를 사용하고 있습니다. 프로그래밍 방식으로 그리드보기를 만들고 목록을 데이터 소스로 사용했습니다. 그러나 페이징/분류 방법을 사용할 수 없기 때문에 Objectsource 컨트롤을 사용하지 않기 때문에 오류가 발생합니다. 페이징과 정렬을 수동으로 처리했지만 효율적으로하고 있는지 모르겠습니다. 사용자가 새 페이지를 클릭하면 다음과 같이 페이지 인덱스 변경을 처리합니다.

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

    this.gvProductList.PageIndex = e.NewPageIndex;
    this.gvProductList.DataSource = userProducts;
    gvProductList.DataBind();
}

그러나 페이지를 변경할 때 항상 데이터베이스가 호출됩니다. 이것을 더 효율적으로 만들 수있는 방법이 있습니까, 아니면 페이징의 정상입니까? 웹 서비스를 사용하여 제품을 얻은 다음 Lambda 표현식을 사용하여 다양한 열에 따라 제품을 분류하는 정렬도 마찬가지입니다. 이런 일이 발생할 때마다 데이터베이스가 호출됩니다 (제품 목록을 다시 얻기 위해). 내가 이것을 잘못 처리하고 있습니까? 나는 세션을 사용하여 목록을 저장할 수 있지만 목록 당 수백 개의 사용자 정의 객체와 한 번에 수만 명의 사용자가있을 수 있습니다.

웹 서비스는 제 3자가 제공하고 (따라서 데이터베이스가 호출되고 있음) SQL Server 자체에 액세스 할 수 없거나 웹 서비스를 변경하는 방법에 액세스 할 수 없음을 의미합니다.

도움을 주셔서 감사합니다.

편집 : 제품 목록은 사용자의 쇼핑 카트라고 언급해야합니다. 따라서 사용자 당 고유합니다.

일반적인 합의 : 쇼핑 카트가 많은 품목을 보유하지 않으면 현재 방법은 괜찮을 것입니다. 그러나 캐싱이 필요한 경우 Proc Sessions를 사용하거나 SQL 서버에 세션을 저장하면이를 달성 할 수 있습니다.

도움이 되었습니까?

해결책

아니요, 기본 데이터베이스의 모든 레코드를 다시 가져 오기 때문에 효율적이지 않습니다 (GetProductList ()가 모든 레코드를 반환한다고 가정). 그리드 뷰 페이징은 주어진 PageIndex에 대해 Pagesize에 정의 된 행의 수만을 보여줍니다. 그러나 실제로 데이터 소스에서 얼마나 많은 레코드가 반환되는지에 영향을 미치지 않습니다.

불행히도, 데이터베이스에 직접 액세스 할 수없고 웹 서비스는 다른 방법을 제공하지 않기 때문에 아마도 당신이 할 수있는 최선은 데이터를 캐시합니다. 다행히 ASP.NET가 만듭니다 캐시 데이터는 아주 간단합니다. 캐시 객체는 사용자 당이 아닌 응용 프로그램 당 하나의 인스턴스 만 있다는 것을 제외하고는 세션과 비슷합니다.

다른 팁

웹 서비스에서 모든 제품을 가져온 다음 웹 페이지 내에서 정렬 및 페이징을 수행하는 것처럼 보입니다. 즉, 한 번에 필요한 것보다 웹 서비스에서 더 많은 데이터를 철회하고 있음을 의미합니다. 웹 서비스는 필요한 페이지, 페이지 크기 및 정렬 순서를 나타내는 인수를 전달할 수있는 시설을 제공합니까? 그렇지 않은 경우 서비스를 제공하는 제 3 자와 이러한 기능을 추가 할 가능성에 대해 논의해야합니다.

이것이 가능하지 않으면 제품 목록이 얼마나 자주 업데이트됩니까? 비교적 드물게 업데이트되면 ASP.NET 캐시를 사용하여 웹 서비스 호출 결과를 로컬에서 저장할 수 있습니다. 캐시 된 데이터 소스는 시간당으로 만료되도록 설정 될 수 있습니다. 이런 식으로 페이지를 보는 사용자는 합리적으로 최신 제품 목록을 볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top