2009-05-16 4 views
2

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

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

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

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

Спасибо.

ответ

2

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

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

1

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

+0

Извините за поздний комментарий; Я думал, что проверил ящик с уведомлением, но не сделал этого. Да, я должен предположить, что это происходит потому, что dll загружается снова. Пока я просто использую базу данных для управления сессиями. –

0

Intraweb в режиме приложения действительно обрабатывает управление сеансом и доступ к базе данных очень плавно и хорошо масштабируется. I've commented on it previously. Хотя это напрямую не отвечает на заданный вами вопрос, когда я столкнулся с теми же проблемами, Intraweb решил их для меня.

Смежные вопросы