2014-12-27 3 views
2

내 웹 사이트 용 검색 모듈을 개발 중입니다. 더 빨리 작동하게하려면 Product 테이블을 Application에 저장하고 싶습니다. 같은 :select 쿼리를 사용하여 응용 프로그램에 저장된 DataTable에서 데이터를 읽는 방법?

 DataLayer dl = new DataLayer(); 
     string CS = dl.dataLayerConnectionString; 
     System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(CS); 

     string FetchSqlSyntax = "SELECT AllImages.ImgSrc, Product.FName, Product.EName, Product.PID FROM AllImages INNER JOIN Product ON AllImages.PID = Product.PID"; 

     System.Data.SqlClient.SqlCommand FetchCmd = new System.Data.SqlClient.SqlCommand(FetchSqlSyntax , con); 

     System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(FetchCmd); 

     System.Data.DataTable dt = new System.Data.DataTable(); 

     da.Fill(dt); 
     if (dt.Rows.Count > 0) 
     { 
      Application["Product"] = dt;    
     } 

는 지금은 Application에 저장 내 ProductGridView에 표시 내 제품 테이블에서 키워드를 검색 관련 일부 데이터를 선택합니다.

결국 성능 향상을위한 올바른 방법입니까? 당신은 당신이 Session하지 Application 사용하도록 조언 할 것이다 당신의 테이블에 배치하여 원하는대로 당신이 할 수있는 그 후)

+0

전체 답변을 확인할 수 있습니다. – mybirthname

답변

2
DataTable table = (DataTable)Application["Product"]; 

을,

내 나쁜 영어에 대한 당신과 죄송합니다 감사합니다.

Session["ProductTable"] = dt; 

어플리케이션 상태는 ASP.NET 애플리케이션 모든 클래스에 사용할 수있는 데이터 저장소이다. 응용 프로그램 상태는 서버의 메모리에 저장되며 정보를 데이터베이스에 저장하고 검색하는 것보다 빠릅니다. 단일 사용자 세션 인 에 해당하는 세션 상태와 달리 응용 프로그램 상태는 모든 사용자에게 적용되고 세션에 적용됩니다. 따라서 응용 프로그램 상태는 한 사용자에서 다른 사용자로 변경되지 않는 자주 사용되는 소량의 데이터를 개 저장하는 유용한 장소입니다.

이 내용은 article입니다. 마지막 문장을 읽고 무엇을 사용할 지 선택하십시오. 내 연습에서는 항상 세션을 사용합니다.

먼저 검색 기능을 Top 10을 안 :

편집 : 코멘트에있는 당신의 질문에 대해

. 페이지 또는 다른 장소를 열 때 모든 요소를 ​​캐시해야합니다. 이 쿼리는 DataTable에 캐시합니다. Top 10으로 만 검색하면 거의 매번 잘못된 결과가 나옵니다.

SELECT 
    AllImages.ImgSrc, Product.FName, Product.EName, Product.PID 
FROM 
    AllImages 
INNER JOIN 
    Product ON AllImages.PID = Product.PID 

누군가가 검색 기능을 사용하면이 같은 확인하게됩니다 : 당신은 단지 특정 검색어에 의한 데이터 또는 DataTable.Select 방법을 선택 LINQ를 사용할 수 후

if(Application["Product"] != null) 
{ 
    DataTable table = (DataTable)Application["Product"]; 
} 
else 
{ 
    //fetch from DataBase 
} 

dt.Select("ename Like '%" + SearchTextBox.Text + "%'"); 

그런 다음 DataTable을 DataSource 또는이를 사용하는 다른 컨트롤로 표에 제공합니다.

주의 : 메모리에 쿼리의

캐싱은 올바른 데이터 <의 무역 -> 성능을 제공합니다. 성능에 어려움이있을 때만 사용하십시오. 이것이 마지막 희망입니다.

내가 당신에게 예를주는거야 : 사용자가 제품 페이지로 이동합니다 우리가 메모리에 100 개 제품을 캐시하면 다른 사용자가 오면

, 우리가 세션/응용 프로그램 만 100 항목을 동원하지만 및 5 개의 새로운 제품을 만들면 메모리에 저장되지 않습니다. 새로운 페칭을 수행하고 메모리에 저장해야합니다. 이에 대한 해결책은 예를 들어 10 분 동안 특정 기간에 메모리 캐시를 지우는 것입니다. 또한 서버 메모리를 가득 채울 수 있기 때문에 캐시 데이터를 지워야합니다!

이렇게하면 새 데이터가 메모리에 저장되지만이 10 분 안에 같은 문제가 발생합니다. 그 때문에 나는이 유형의 캐싱이 올바른 데이터 -> 성능 사이의 거래라고 말했습니다.

+0

감사합니다. 맞아,하지만 문제는 어떻게 datatable에서 특정 데이터를 가져올 수 있습니까? –

+0

'SELECT TOP (10) AllImages.ImgSrc, Product.FName, Product.EName, Product.PID FROM AllImages INNER JOIN 제품에서 AllImages.PID = Product.PID 여기서 (fname LIKE N'% "+ SearchTextBox.Text +"% '또는 ('N '% "+ SearchTextBox.Text +"% ")와 (allimages.imgorder = 1)를 입력하십시오. 어떻게 datatable에서이 쿼리를 선택할 수 있습니까? –

+0

@MahdiHesari 내 편집을 확인하십시오. 나는 당신이 알고 있어야 다른 것들을 추가 할 것입니다. – mybirthname

1

데이터베이스에서 모든 데이터를 가져온 다음 메모리에서 검색하면 성능이 좋지 않을 것이라고 생각합니다. 데이터베이스에서 검색을 수행하고 데이터를 가져온다면 성능이 훨씬 좋아질 것입니다. . 데이터베이스는 이러한 종류의 작업에 최적화되어 있으며 메모리에서 수행하면 불필요하게 데이터를 데이터베이스에서 읽어야합니다.

+1

나는 이것이 사실이 아니라고 확신합니다. 내 대답을 가리키는 기사를 읽을 수 있습니다. 여기에 그것의 일부입니다 * 응용 프로그램 상태는 서버의 메모리에 저장되며 데이터베이스에 정보를 저장하고 검색하는 것보다 빠릅니다. * – mybirthname

+0

감사합니다. 그러나 "mybirhname"이 알려짐에 따라 응용 프로그램 상태는 서버의 메모리에 저장되므로 데이터베이스에 정보를 저장하고 검색하는 것보다 빠릅니다. 더 나은 성능을위한 또 다른 방법을 고려하고 있습니까? –

+0

메모리에 모든 데이터가 있고 데이터베이스를 전혀 쿼리하지 않아도되면 더 빠를 것입니다.하지만 항상 가능하지는 않습니다. –

관련 문제