2010-03-02 7 views
1

데이터베이스 레코드와의 거리를 계산하는 함수가 있습니다. 이 함수는 한 번 asp.net 페이지 요청에서 두 번 호출됩니다. 이 기간에는 결과가 변경되지 않습니다. 결과를 캐시하려면 앱에서 성능이 필요합니다.asp.net에서 함수를 캐시하는 방법

예를 들어

:는 IF-조건 세션에서 저장

public static int GetKilometers(int VehicleID) 
{ /*some db query and calculations*/ } 

답변

2

한 페이지 요청 (당신이 당신의 질문에 언급로)의 수명은, 단순한 지역 변수는 충분합니다 :

private int? _dist; 

public int GetKilometers(int VehicleID) 
{ 
    if (_dist == null) { 
     _dist = /*some db query and calculations*/ 
    } 
    return _dist; 
} 

이 두 번 데이터를 계산하지 않음으로써 일부 효율성을 과도하게 캐시에서 메모리 문제를 방지하지만, 여전히 허용 것 일 동일한 요청.

한 가지주의 할 점은 응용 프로그램의 여러 사용자간에 결과가 캐시되므로이 정적을 원하지 않는다는 것입니다.

+0

예 ... 내 대답을 타이핑하는 동안 Ryan이 말한 것! ;) (+1) – Lazarus

0

가 확실히 빠르고 쉽게 솔루션의

if(Session["functionresult"] == null) 
{ 
    Session["functionresult"] = functionResult; 
} 
+0

큰 데이터를 세션에 저장하는 것이 좋습니다. 또한 단지 하나의 가치가 없습니다. 그들 중 50 ~ 1000 명이있을 수 있습니다. –

1

을 변경하지 않는 경우, 당신은에 HttpContext.Session 객체를 사용할 수 있습니다 다음과 같은 값을 저장하십시오.

int distance; 
if(Session["distance"] == null) 
{ 
    distance = GetKilometers(vehicleId); 
    Session["distance"] = distance; 
} 
else 
{ 
    distance = Convert.ToInt32(Session["distance"]); 
} 

이것을 자신의 방법으로 추상화하십시오.

EDIT

상기 용액 데이터 최소량 좋다. 많은 양의 데이터가 귀하의 경우에 저장되는이있을 것이라는 사실을 감안할 때, 나는이 두 가지 가능한 시나리오 참조 : 차량 X에 대한

계산 된 데이터는 별도의 계산 된 데이터 각 사용자
캐시 다릅니다 UserId (또는 SessionId), VehicleId 및 CalculatedData가있는 데이터베이스의 테이블. 차량에 대한 X

계산 된 데이터는 차량 (X)의 데이터베이스에 차량 테이블의 열 데이터를 산출
캐시가 필요한 모든 사용자에 대해 동일하다.

어느 쪽이든 데이터베이스를 호출하면 사용자가 현재 요청에 필요한 모든 차량에 대한 데이터를 검색해야합니다. 그런 다음 현재 요청에 대해서만 사용되는 로컬 변수에 해당 데이터를 저장합니다. 세션별로 데이터를 캐싱하려는 경우 HttpContext.Session을 사용하여 SessionId를 저장하고이를 사용하여 데이터베이스에서 데이터를 검색 할 수 있습니다.

+0

6000 대의 차량과 500 명의 사용자가있을 수 있습니다. 사용자는 예를 들어 일주일 이내에 모든 차량을 쿼리 할 수 ​​있습니다. –

+0

메모리 관리가 걱정된다면 데이터베이스에 저장된 세션을 쉽게 구현할 수 있습니다. 이 경우 HttpContext.Session에 sessionId를 저장하고 요청의 수명주기 전반에 걸쳐 여러 쿼리 대신 단일 쿼리로 데이터베이스의 세션 데이터를 검색 할 수 있습니다. 이렇게하면 최소한의 양의 데이터 만 메모리에 남아있게됩니다. – Aaron

+0

그래서이 기능은 한 페이지에 대해 6000 번 호출 할 수 있다고 말하고 있습니까? – Lazarus

0

많은 계산이있는 경우 Session을 사용하는 것보다 서버 메모리가 많이 소모됩니다. ViewState를 사용할 수는 있지만 페이지가 꽤 무거워집니다.

데이터베이스에 충돌하지 않을 가능성이 있습니까? 또는 db에 대한 왕복 횟수를 최소화하십시오.

뭔가 같은 :

공공 정적 INT GetKilometers (INT [] VehicleID) {/ * 하나의 이동 */모든 데이터를 얻을 수} 당신의 결과에 대한에만 관심이 있다면

+0

아마도 MySql의 다른 테이블에 결과를 저장할 수 있습니다. 차량에서 매분마다 위치 데이터를받습니다. Longtitude와 Lattitude 데이터 사이에 빗변을 계산하고이 데이터의 합계를 반환합니다. 또한 아약스로 데이터를 호출합니다. –

+0

예, 작동합니다. 캐싱 외에도, 나는 한 번에 결과를 얻으려고했다. 대신에 db 요청을하는 함수를 x 번 호출하는 것보다 (이제는 어떻게 작동하는지 추측한다.) 모든 차량 ID를 한 번에 데이터베이스로 보내고 한 번에 모든 마일리지를 돌려 보내십시오. 이렇게하면 x 연결보다 1 db 연결이됩니다. 나는 db 히트가 당신이보고 있어야하는 것이라고 생각한다. – Steve

1

OP의 질문에서 이러한 모든 대답이 유용하며 구문이 같지만 잘못된 모음이 사용되고 있습니다. 이에 대한 적절한 수집은 HttpContext.Current.Items입니다. 이것을 @Aaron의 답변과 결합하십시오.

관련 문제