2009-05-16 4 views
2

Apache와 함께 TWebModule을 사용하고 있습니다. 만약 이전에 생성 된 모든 객체가 요청을 처리하는 중이라면 아파치는 정확하게 TWebModule 객체의 또 다른 인스턴스를 생성합니다. 이 올바른지?TWebModule의 세션 관리

내 자신의 SessionObject를 만들고이를 저장할 TStringList를 만들었습니다. StringList는 TWebModule 객체를 포함하는 소스 코드 파일의 맨 아래에있는 초기화 섹션에서 만들어집니다. 초기화가 여러 번 호출 될 수 있다는 것을 알았습니다 (아마도 아파치가 다른 프로세스를 생성해야 할 때).

모든 세션 개체를 보관할 글로벌 "세션"TStringlist를 사용할 수있는 방법이 있습니까? 아니면 데이터베이스에 세션 정보를 저장하고 각 요청에 대한 쿠키를 기반으로 검색하는 "안전하고"적절한 방법입니다.

내가 원하는 이유는 데이터베이스 액세스를 줄이고 메모리에 세션 정보를 보유하기 위해서입니다.

감사합니다.

답변

2

Stijn이 제안했듯이 세션 데이터를 보유하기 위해 별도의 스토리지를 사용하는 것이 가장 좋은 방법입니다. 웹 브라우저가 본질적으로 디자인에 포함되도록 응용 프로그램을 작성하는 것이 더 좋습니다. 이렇게하면 훨씬 적은 하드웨어로 수천 또는 수만 명의 동시 사용자에게 응용 프로그램을 확장 할 수있는 기능이 크게 향상됩니다.

Intraweb은 훌륭한 옵션이지만 더 많은 동시 사용자, 심지어 IDLE 사용자라도 지원하려면 더 많은 하드웨어가 필요하다는 점에서 규모 문제가 있습니다. 가능한 한 내부적으로 stateless로 실행되는 서버의 메소드를 처음부터 설계하는 것이 훨씬 낫습니다. 물론 고정 된 수의 사용자가 있고 성장을 기대하지 않는다면 이는 별 문제가되지 않습니다.

1

이상합니다. 초기화 섹션이 두 번 이상 호출되면 DLL이 별도의 프로세스 공간에로드되기 때문일 수 있습니다. 내가 생각할 수있는 한 가지 옵션은 초기화 할 때 "세션"개체가 이미 존재하는지 확인하는 것입니다. DLL이 실제로 다른 프로세스에서로드되는 경우이 방법은 도움이되지 않습니다. 그런 다음 중앙 세션 저장소 프로세스를 작성하고 TWebModule 내에서 프로세스 간 통신을 사용하는 것이 좋습니다. 메시지, 명명 된 파이프, COM 등 몇 가지 방법이 있습니다. ..)

+0

최근 의견에 사과드립니다. 알림 상자를 확인했지만 알리지는 못했습니다. 예, dll이 다시로드되기 때문에 가정해야합니다. 지금은 세션 관리를 위해 백엔드 데이터베이스 만 사용하겠다. –

0

Intraweb은 응용 프로그램 모드에서 세션 관리 및 데이터베이스 액세스를 매우 원활하게 처리하고 잘 확장됩니다. I've commented on it previously. 이 질문은 귀하가 요청한 질문에 직접 답하는 것은 아니지만, 같은 문제에 직면했을 때 Intraweb이 문제를 해결했습니다.