2013-07-01 3 views
0

이 작업은 아마도 간단한 작업이지만이 작업을 수행하는 방법에 대한 좋은 예를 찾을 수 없었습니다. 내 ASP 응용 프로그램에서 사용자가 업데이트 할 수있는 TextBox 있습니다. TextBox의 Text 속성이 페이지에 액세스하는 모든 사용자에 대해 해당 변수로 설정되도록이 변수의 값을 중앙 위치에 저장하는 방법을 찾고 있습니다. 또한이 변수는 다른 사용자가 업데이트 할 때까지 유지되어야합니다. 최악의 경우 최악의 상황에서이 값을 저장하고 거기에서 가져 오는 데이터베이스 테이블을 만들 수 있지만 ASP 또는 IIS에이 기능이 내장되어 있다고 상상했습니다.모든 세션에서 변수 저장

+0

당신은 무엇이라고를 찾고 있습니다 "응용 프로그램 상태"로. – crush

+0

여기서 찾고있는 것은 데이터베이스입니다. 그것은이 문제에 대한 적절한 해결책입니다 ... – Servy

답변

3

찾고있는 것이 Application State . 다음과 같이

당신은 그것을 사용할 수 있습니다

Application["Message"] = "Welcome to the Contoso site."; 

할 수 있습니다 예를 들어, 목록 같은 경우에도 저장소 개체 :

Application["MyList"] = new List<string>(); 

List<string> myList = Application["MyList"] as List<string>; 
myList.Add("Test"); 

동시성이 블라드 Bezden으로

관심사 추가 된 경우 응용 프로그램 컬렉션을 동기화하는 것이 중요합니다. 스레드가 동시에 수정하려고합니다. 이 제 1 잠금 수행 후 다음과 같이 수집을 해제된다

Application.Lock(); 
//Do any code that modifies or retrieves a value from the collection here 
Application['MyMessage'] = "MyMessage"; 
MyClass myObject = Application['MyObject'] as MyClass; 
Application.UnLock(); //Make sure you unlock it, or you will be in for a world of hurt. 

애플리케이션 상태 애플리케이션 상태 데이터가 다수의 스레드에 의해 동시에 액세스 될 수 있다는 것을 의미하는 프리 스레드이다. 따라서 응용 프로그램 상태 데이터를 업데이트 할 때 기본 제공 동기화 지원을 포함하여 스레드로부터 안전한 방식으로 수행해야합니다. 잠금 및 잠금 해제 방법을 사용하여 데이터를 쓰기 위해 잠글 때 한 번에 하나씩 소스로 데이터 무결성을 보장 할 수 있습니다. Global.asax 파일의 Application_Start 메서드에서 응용 프로그램 상태 값을 초기화하여 동시성 가능성을 줄일 수도 있습니다.

concurrency concerns here에 대해 자세히 알아보십시오.

확장 성 우려 응용 프로그램이 여러 웹 서버 응용 프로그램을 실행하는 경우 웹 농장/클라우드 시나리오로, 확장 고려해야 할 필요가있는 경우 존 손더스Servy이 의견에 지적

함께 사용하면 영구 데이터를 유지 관리하기위한 데이터베이스 솔루션을 사용하는 것이 좋습니다. 그런 다음 데이터베이스 요구 사항을 웹 서버와 독립적으로 확장 할 수 있으며 동시성 관련 문제도 처리 할 수 ​​있습니다. 그러나이 시나리오에서는 여전히 Application State를 사용하여 자주 업데이트되지 않는 데이터를 캐싱 할 수 있습니다.

+1

흠. 이것은 웹 팜에서 잘 작동하지 않습니다. –

+2

@JohnSaunders 그는 웹 팜을 운영하고 있음을 나타내지 않았다.] – crush

+1

@crush 문제는 응용 프로그램의 확장 방법을 예측하기가 어렵다는 것입니다. 그것은 * 지금 * 일 수는 없지만 몇 년 안에있을 수 있습니다. – Servy

2

웹 서버가 하나 뿐인 경우 응용 프로그램 상태를 사용할 수 있지만 응용 프로그램 상태는 웹 팜에서 작동하지 않습니다. 응용 프로그램을 웹 팜에서 실행하고 여러 웹 서버간에 상태를 공유해야하는 경우 중앙 집중식 저장소 (DB)를 사용해야합니다.경우

응용 프로그램 국가가 당신을 위해 작동하는 경우, 당신은 당신이 그것을 변경하기 전에 잠금 및 잠금 해제 Applicaion 오브젝트 할 필요가 경쟁 조건이없는 있는지 확인

Application.Lock(); 
Application["myMessage"] = newValue; 
Application.UnLock(); 
+0

내 대답은 아래에 잘 추가되었습니다. 그가 요청/세션을 통해 지속되는 가치가 소수의 시간을 변경하려는 경우 지속성/장애 조치를 위해 데이터베이스에 저장하고 응용 프로그램 상태에서 로컬로 캐시하여 가져 오기를 최소화하는 것이 유리하지 않습니까? – crush

+0

나는 경주 조건에 대해 생각하지 않았다. 그래서 이것을 구축해 주셔서 감사합니다. – Andrew

관련 문제