2011-11-10 2 views
0

약 7,000 개의 레코드로 구성된 테이블이 하나뿐입니다. GridView는 이러한 레코드를 한 번에 10 개의 행 (GridView와 함께 제공되는 자동 페이징 기능 사용)으로 표시합니다.ASP.NET : 몇 줄의 코드에서 메모리 사용을 향상시키는 방법은 무엇입니까?

다음은 테이블을 읽고 레코드를 보여주는 방법입니다. 외관상으로는, 나는 전체적인 테이블에서 읽는 그러나 기억의 낭비하게 보이는 10 개의 줄만 표시한다. 하지만 페이징 (페이징)이 작동 할 수 있도록 전체를 읽을 필요가 있다고 생각합니다. 내가 잘못? 이 코드를 개선 어떻게 그렇다면 :

private void ShowGridViewData() 
    { 
     // I LEAVE ONLY RELEVANT CODE TO AVOID CLUTTER 

     string queryString = (string)Session["queryString"]; 
     String connectionString = ConfigurationManager.ConnectionStrings["productsSQLConnectionString"].ConnectionString; 
     DataSet ds = new DataSet(); 

     SqlConnection connection = new SqlConnection(connectionString); 
     SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); 



     // Fill the DataSet. 
     adapter.Fill(ds); 

     GridView1.DataSource = ds; 
     GridView1.DataBind(); 


     adapter.Dispose(); 
     connection.Close(); 


    } 

추가 정보 : 내가 LINQ를 사용하는 코드를 변경할 수 없습니다. 전체 테이블을 읽기로 결정했을 때 한 가지 더 많은 이유는 페이징에 다른 데이터베이스 액세스가 필요하지 않기 때문입니다. 나는이 추론에 틀릴 수도있다.

+0

추가 정보 : LINQ를 사용하도록 코드를 변경할 수 없습니다. 전체 테이블을 읽기로 결정했을 때 한 가지 더 많은 이유는 페이징에 다른 데이터베이스 액세스가 필요하지 않기 때문입니다. 나는이 추론에 틀릴 수도있다. – user776676

+0

댓글을 달기보다는 원래 질문을 편집하는 편이 훨씬 낫습니다. –

답변

2

을 '혼란을 방지하기 위해 제거'된 코드에 포함 된 가정하지만 난 페이징이 작동 할 수 있도록 전체 오두막에서 읽을 필요가 있다고 생각합니다.

예하지만 데이터 소스 Manually setting a GridView's PageCount when DataSource doesn't return full result set?

그리고 내가 가진 또 하나의 이유를 저는 전체 테이블에 읽기로 결정했을 때 당신은 개체를 사용하여 전체 데이터 집합을로드하지 않고 사용 페이징을 할 수 입니다 페이징은 다른 데이터베이스 액세스를 필요로하지 않습니다. 이 추론에 나는 일 수 있습니다.

예 및 아니오 실제로 사용 사례에 따라 다릅니다. 일반적으로 세션 당 요청이 아닌 리소스 사용에 대해 더 걱정해야합니다.이렇게하면 사용하지 않는 리소스 (유료 재생)를 할당하지 않습니다.

대개 나는 유료 재생 모델을 따르고,

비싼 SQL 작업이 결과 집합 경우 을 처리하는 것은 작은하지만 앤서니 쇼의 대답처럼 캐시 할 수 있습니다 요약 작업처럼 만드는 데 시간이 오래 걸리는 재.

글로벌 상태 사용자간에 공유되는 내용이 있다면 첫 번째 사용자 만 지불하고 다른 사용자는 무료입니다. 하지만 여전히 합리적인 것이 필요합니다 caching policy)

1

이 블로그 항목을 살펴보십시오. SQL에서 ROW_NUMBER() 함수를 사용하여 ad-hoc sql 페이징을 생성합니다. 올바른 페이지 번호를 전달해야합니다.

http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx

보너스는 예는 이미 페이지 크기 :

1

하나의 옵션은 페이징 그러니 당신의 저장 프로 시저 또는 LINQ를 사용하여 SQL을 수 있도록하는 것입니다으로 10을 사용합니다. efficient way to implement paging

1

그것은 당신이 무엇을하고 있는지에 따라 달라집니다하지만 당신은 업데이트하지 않는 내용이있는 경우 많이 캐싱 고려 : 이 포스팅은 것을 다룹니다. 그런 다음 표시되는 내용이 업데이트되면 캐시를 삭제하거나 업데이트하십시오. 아무 것도 변경되지 않으면 SQL에 대한 새로운 연결을 방지하는 데 도움이됩니다!

3

질문의 동적을 완전히 바꾸는 의견을 추가 했으므로 두 번째 답변을 게시하고 있습니다.

매번 데이터베이스를 사용하지 않으려면 세션에 데이터 세트를 저장하고 매번 액세스하십시오. 위에서 보았던 코드를 수정하여 GridView에 페이징을 구현하는 곳입니다. 나는 그

private void ShowGridViewData() 
{ 
    // I LEAVE ONLY RELEVANT CODE TO AVOID CLUTTER 

    DataSet ds = new DataSet(); 
    if (Session["ProductsDataSet") == null) { 

     string queryString = (string)Session["queryString"]; 
     String connectionString = ConfigurationManager.ConnectionStrings["productsSQLConnectionString"].ConnectionString; 

     SqlConnection connection = new SqlConnection(connectionString); 
     SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); 

     // Fill the DataSet. 
     adapter.Fill(ds); 

     Session["ProductsDataSet"] = ds; 

    } else { 
     ds = (DataSet)Session["ProductsDataSet"] 
    } 

    GridView1.DataSource = ds; 
    GridView1.DataBind(); 


    adapter.Dispose(); 
    connection.Close(); 
} 
관련 문제