Управление сессиями в TWebModule - PullRequest
2 голосов
/ 16 мая 2009

Я использую TWebModule с Apache. Если я правильно понимаю, Apache создаст другой экземпляр моего объекта TWebModule, если все предыдущие созданные объекты заняты обработкой запросов. Это правильно?

Я создал свой собственный SessionObject и создал TStringList для их хранения. StringList создается в разделе инициализации в нижней части моего файла исходного кода, содержащего объект TWebModule. Я считаю, что инициализация может быть вызвана несколько раз (предположительно, когда Apache должен порождать другой процесс).

Есть ли способ, которым я мог бы иметь глобальный TStringlist "Sessions" для хранения всех моих объектов сеанса? Или «Безопасный», подходящий метод для хранения информации о сеансе в базе данных и извлечения ее на основе файла cookie для каждого запроса?

Причина, по которой я хочу это, заключается в том, чтобы сократить доступ к базе данных и вместо этого хранить информацию о сеансе в памяти.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 18 мая 2009

Как предложил Стейн, лучше всего использовать отдельное хранилище для хранения данных сеанса. Еще лучше попытаться написать свое приложение так, чтобы веб-браузер содержал состояние, присущее дизайну. Это значительно расширит возможности масштабирования вашего приложения до тысяч или десятков тысяч одновременно работающих пользователей с гораздо меньшим количеством оборудования.

Intraweb - отличный вариант, но он страдает от проблемы масштабирования в том смысле, что более параллельным пользователям, даже пользователям IDLE, требуется больше аппаратного обеспечения для поддержки. Гораздо лучше с самого начала спроектировать способ работы вашего сервера с максимально возможным внутренним состоянием. Конечно, если у вас фиксированное количество пользователей и вы не ожидаете роста, это не проблема.

1 голос
/ 17 мая 2009

Странно. Если разделы инициализации вызываются более одного раза, это может быть связано с тем, что DLL загружается в отдельных пространствах процессов. Один вариант, который я могу придумать, - это проверить, существует ли объект «Sessions», когда вы создаете его при инициализации. Если DLL действительно загружается в отдельных процессах, это не поможет, и тогда я предлагаю написать центральный процесс хранения Session и использовать межпроцессное взаимодействие из вашего TWebModule (есть несколько методов: сообщения, именованные каналы, COM. ..)

0 голосов
/ 17 мая 2009

Intraweb в режиме приложения действительно очень гладко управляет сессиями и доступом к базе данных и хорошо масштабируется. Я прокомментировал это ранее . Хотя это не дает прямого ответа на вопрос, который вы задали, когда я столкнулся с теми же проблемами, Intraweb решил их для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...