2011-02-27 3 views
3

나는 온라인 사용자과 가 많이 거래하는 ASP.Net MVC 응용 프로그램 "다소 게임"을 만들고 있습니다.정적 목록 <User> Asp.Net의 온라인 사용자를위한 VS DataBase?

"10s"마다 Ajax 요청을 실행하여 Action으로 지정하여 사이트를 열어두면 사용자를 온라인 상태로 유지합니다. Action업데이트LastActivityDateUser - ((정적 List 및 DataBase에서 사용)).


그래서 질문은 다음과 같습니다

  • 때 사용자가 목록에 그를 추가 할 로그인 정적 목록에서 온라인 사용자를 저장하고 코드를 작성하는 것이 더 나은가요 "10s"마다이 목록을 관리하여 오프라인 사용자를 퇴출 시키십시오.
  • 또는 OnlineUsers을 원할 때마다 온라인 사용자 을 데이터베이스에서로드하는 것이 가장 좋습니다.


참고 : 나는 같은 몇 가지 주기적으로 작업 수행이 SO Question에서 기술을 사용하고 OnlineUsers에게 정적 목록을 재-관리 할 수 ​​있습니다.

답변

2

먼저이 사용자에 대해 List<User>을 사용하지 않고 사용자 ID를 키로 사용하여 Dictionary<int,User>을 사용하면 사용자를 즉시 ​​찾을 수 있습니다. 둘째로, 아마도 둘 다 혼합 된 것 같습니다. 현재 사용자의 캐시 된 사본을 보관하고 주기적으로 DB에서 새로 고치고 필요한 경우 비동기 적으로 데이터를 DB에 유지합니다. 코드의 여러 위치에서 이러한 종류의 작업을 수행하는 경우이 동작을 캡슐화하는 사용자 용 사용자 지정 지속성 클래스에 대해 생각할 수 있습니다.

+0

감사합니다. 사용자 이름으로'Dictionary '이 생기면 내 'userID'는'GUID'입니까? 그렇다면 문자열을 키로 사용하는 데 문제가 있습니까? –

+0

@Wahid - 고유 한 한 잘 작동합니다. – tvanfosson

2

많은 수의 사용자를두고 DB에서 데이터를 자주 가져와야하는 경우 Cache에 사용자 목록을 저장하는 것이 좋습니다. 분명히 이것은 서버의 메모리에 저장 될 것이므로 많은 양의 객체를 저장하고 싶지는 않겠지 만 단순한 온라인 사용자 목록 일 경우 문제가되지 않습니다.

+2

세션은 사용자가 아니므로 각 사용자의 세션에 모든 사용자의 복사본을 저장하지 않으므로 세션이 아닌 캐시에있을 수 있습니다.또한 LastActivityDate에는 현재 사용자 목록보다 많은 용도가있을 수 있으므로 결국에는 값을 유지해야합니다. – tvanfosson

+0

하지만 정적 클래스 또는 목록은 캐시 만료 시간 "또는 세션"을 신경 쓸 필요없이 모든 사용자간에 공유됩니다. 왜 그냥 사용하지 않을까요 ?? –

+0

너희들 말이 맞아. 결정된. 수면 부족! – FreeAsInBeer

1

정적 범위는 항상 운영 체제에서 실행되는 프로세스의 범위입니다. 따라서 데스크톱 응용 프로그램에서 정적 사용은 의미가 있습니다. 그러나 프로세스를 제어하지 않기 때문에 서버 측 응용 프로그램에 대해 정적 인 용도를 임의로 사용할 수 있습니다. 이 작업을 수행하는 웹 서버입니다. 프로세스가 예기치 않게 종료되면 어떻게됩니까? 또는 응용 프로그램을 제공하는 프로세스가 많은 경우 어떻게해야합니까?

따라서 데이터베이스 사용은 불가피합니다. 정적 범위는 정적 캐시 일 수는 있지만 신뢰할 수는 없습니다.

+0

추락 한 경우 온라인 목록을 다시로드하는 데 필요한 일부 논리를 넣으려고합니다. 충분합니까 ?? –

+1

네, 물론 좋습니다. 주의를 기울일 유일한 다른 작업은 크기 조정입니다. 응용 프로그램에 두 개 이상의 서버가 필요한 경우 하나 이상의 프로세스가있는 경우 정적 범위는 문제가되지 않습니다. 그러나 하나의 서버로 충분하다면 문제가 없습니다. – linepogl

관련 문제