Збереження стану сеансу в базі даних (шаблон проєктування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Збереження стану сеансу в базі даних (англ. 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);
    }
}

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]