2009-05-07 5 views
3

나는 ASP.NET의 세션 변수에서 모든 것을 훑어 보려고 노력했다. (나는 윈도우 프로그래밍 배경에서왔다.) 나는 일반적으로 무엇인가를 명시 적으로 저장하는 것을 완전히 멈췄다. 세션 변수. 누구든지 세션 변수의 수용 가능한 사용에 대해 어떤 지침을 줄 수 있습니까?ASP.NET에서 세션 변수의 수용 가능한 사용으로 고심

다음은 구체적인 예입니다 ... 데이터베이스에서 비즈니스 개체를로드하고 화면을 채우고 편집합니다. 사용자는 값을 편집하고 저장할 수 있습니다. 비즈니스 오브젝트를로드하고, 양식을로드하고, 비즈니스 오브젝트를 세션 변수에 저장하는 옛날 방식. 사용자가 저장을 클릭하면 세션 변수에서 비즈니스 객체를 검색하고 편집 된 값을 대체 한 다음 저장합니다. 새로운 방식으로 데이터베이스에서 비즈니스 객체를로드하고 폼을로드합니다. 사용자가 값을 편집하고 저장을 클릭합니다. 데이터베이스에서 내 비즈니스 개체를 다시로드하고 편집 된 값을 바꾼 다음 저장합니다. 나는 웹 프로그래밍 전문가는 아니지만 첫 번째 방법은 세션 변수를 사용하는 나쁜 오명 때문에 잘못되었다고 느낀다. 두 번째 방법은 잘못되었다고 느낀다.). 여기서 캐싱의 어떤 형태도 고려하지 않겠습니다. 어떻게 처리할까요?

답변

7

사용자 변경 사항을 저장하기 위해 포스트 오피스의 데이터베이스에서 비즈니스 오브젝트를 다시로드하여 불쾌감을주지는 않습니다.

그 객체는 해당 포스트 백의 어딘가에서 왔고 특정 객체를 잡는 것 같은 빠른 DB 호출과 관련된 제한된 오버 헤드가 가장 좋은 방법 일 것입니다. 포스트 뒷면에 다시 메모리에서 해당 비즈니스 오브젝트를 취득하기위한

귀하의 옵션 :

  • 는 다시 DB에서 가져옵니다. 단점 : 일부 (작은) 추가 DB 오버 헤드
  • 사용자의 세션에 저장하십시오. 단점 : 잠재적으로 여전히 데이터베이스에 충돌 (세션 상태가 저장되어있는 경우) 또는 많은 메모리를 사용하는 경우 (세션 상태가 저장되어있는 경우) 여러 사용자가이 개체에 액세스 할 수있는 경우 여러 사본을 저장할 수 있으며 그 중 최악 인 경우 해당 세션 개체가 어떤 이유에서 건 제거 된 경우 사용자가 제출 한 조회수와 함께 사라질 수 있습니다.
  • 캐시에서. 단점 : 일부 추가 메모리를 사용하고 캐시가 존재하지 않으면 DB로 이동해야하지만 캐시를 사용하는 데 더 많은 병목이있는 앱이있는 큰 돈을 넣을 것입니다.
  • Viewstate. Viewstate에 객체를 저장할 수 있습니다 (이 객체는 클라이언트로 전송 된 다음 클라이언트가 다시 게시합니다). 단점 : 최악의 해결책, 내 생각에. Viewstate에 추가하면 와이어가 다운 스트림 및 업스트림으로 이동하여 페이지 크기가 커집니다. 세션이 최고는 아니지만 Viewstate는 악마입니다.
1

많은 사용자가 있습니까?

사이트의 볼륨이 적은 경우 세션에 비즈니스 개체를 저장하는 것이 좋습니다.

SQL Server를 사용하여 세션을 저장하는 경우 효과적으로 포스트 백 당 데이터베이스에서 비즈니스 개체를로드합니다.

그러나 경험상 사용자 세션의 수명에 적용 할 수있는 정보 만 저장하기 위해 Session을 사용하는 경향이 있습니다. 단일 웹 양식과 관련된 비즈니스 오브젝트는이 카테고리에 실제로 적합하지 않습니다. 볼륨이 큰 사이트의 경우이 전략을 사용하면 확장성에 도움이됩니다. 관심있는 모든 요인에 따라 달라집니다.

:

0

업데이트하기 전에 데이터베이스에서 개체를 다시로드하는 것은 잠재적으로 매우 위험합니다. 가능한 동시성 위반이 누락 될 수 있습니다.

예를 들어,이 흐름이 발생하는 경우 : 컴퓨터 1 고객 1

  1. 표시 편집 화면
  2. 표시 편집 화면을 고객 1 컴퓨터 2에
  3. 핸들 업데이트를 고객 1 컴퓨터 1
  4. 에서 컴퓨터에서 고객 1
  5. 핸들 업데이트는 2

(4) 때문에 실패 할 가능성이 있습니다 즉, 업데이트가 컴퓨터 2가 인식하지 못했던 변경 사항을 덮어 쓰는 중입니다. 그러나 데이터베이스에서 다시로드하면 이러한 문제점을 무시하고 최종 업데이트를 구현하게됩니다.

이런 종류의 상황에서 세션 (또는 양식의 숨겨진 필드)에 원래 엔티티를 두는 것이 동시성에 대해 신경 쓰면 절대적으로 올바른 일이라고 생각합니다.

+0

예, 분명히 나는 ​​타임 스탬프 필드의 사용을해야하지만주의 할 가치 ... 추가 읽기 데이터베이스를 다시 타격 좋아하지 않는 많은 사람들을 언급 할 필요가 없을 것입니다. –

관련 문제