Збереження стану сеансу в базі даних (шаблон проєктування)
Ця стаття не має інтервікі-посилань. |
Збереження стану сеансу в базі даних (англ. Server Session State) — шаблон проєктування, який пропонує зберігати стан сеансу в базі даних.
При реалізації клієнт-серверної архітектури необхідно реалізувати передачу даних між обома сторонами. При цьому варто зберігати інформацію про сеанс.
Коли клієнт відправляє запит до сервера, перше, що робить сервер — це звертається до бази даних, щоб отримати із неї данні необхідні для запиту. Після чого він (сервер) виконує всю необхідну роботу та записує дані назад у сховище. Якщо дані ідентифікують сеанс та вимагають довготривалого збереження, але короткотривалої взаємодії рішенням буде зберігати сеанс в базі даних та кешувати його на момент роботи.
Таким чином, даний шаблон пропонує зберігати стан сеансу в базі даних.
- Легко обмінювати стан сесії при наявності реплікацій вебсервера
- Стан сеансу не втрачається, якщо сервер виходить із ладу
- Висока надійність. Інформація про користувача прихована в сховищі
- Можна легко збільшувати розмір сесії
- Необхідно витрачати додаткові ресурси на відновлення сеансу. В деяких випадках варто застосовувати кеш, що при довгій роботі сеансу може погано вплинути на продуктивність серверу
- Не доцільно зберігати стан сесії, якщо вона ніколи більше не відновлюється
- Якщо декілька вебсерверів працюють з однією сесією варто попіклуватись про конкурентний доступ
Типовим прикладом буде відновлення даних користувача при автентифікації.
class Auth
{
public User { get; private set; }
public void Login(int id)
{
var userRecord = db.GetUser();
this.User = new User(userRecord.Name, userRecord.Email);
}
}
Якщо сеанс складається із декількох кроків та необхідно не втрачати даних, то в міру заповнення їх можна зберігати у сховищі. Так, наприклад, при реалізації опитувальника необхідно, щоб користувач не втратив заповнені дані. Тоді при заповнені кожного поля, можна запам'ятовувати їх у сховищу, а при повторному відкриті сторінки відновлювати увесь стан.
class SurveyService
{
public void SaveAnswer(int answerId, string answerValue)
{
db.SurveyAnswers.Add(answerId, answerValue);
}
public IReadOnlyCollection<SurveyAnswer> OpenSurvey(int surveyId)
{
return db.SurveyAnswers.Where(s => s.SurveyId == surveyId);
}
}
- Database Session State [Архівовано 26 січня 2021 у Wayback Machine.]
- Patterns of Enterprise Application Architecture [Архівовано 28 березня 2014 у Wayback Machine.]