Creatio development guide
PDF
Это документация Creatio версии 7.16.0. Мы рекомендуем использовать новую версию документации.

Особенности использования хранилищ данных и кэша

Glossary Item Box

Для повышения эффективности работы с хранилищами данных и кэшами в конфигурационной логике и в логике реализации бизнес-процессов необходимо учитывать следующее:

1. Все объекты, помещаемые в хранилища, должны быть сериализуемыми. Такое требование обусловлено спецификой работы с хранилищами ядра приложения. Так, при сохранении данных в хранилища (за исключением хранилища данных уровня Request) объект предварительно сериализуется, а при получении — десериализуется.

2. Обращение к хранилищу является относительно ресурсоемкой операцией. В связи с этим в коде необходимо избегать излишних обращений к хранилищу. В примерах 1 и 2 приводятся корректные и некорректные варианты работы с кэшем.

Пример 1

Неоптимальный код:

// Выполняется сетевое обращение и десериализация данных.
if (UserConnection.SessionData["SomeKey"] != null)
{
    // Повторно выполняется сетевое обращение и десериализация данных.
    return (string)UserConnection.SessionData["SomeKey"];
}

Оптимальный код (вариант 1):

// Получение объекта из хранилища в промежуточную переменную.
object value = UserConnection.SessionData["SomeKey"];

// Проверка значения промежуточной переменной.
if (value != null)
{
    // Возврат значения.
    return (string)value;
}

Оптимальный код (вариант 2):

// Использование расширяющего метода GetValue().
return UserConnection.SessionData.GetValue<string>("SomeKey");

Пример 2

Неоптимальный код:

// Выполняется сетевое обращение и десериализация данных.
if (UserConnection.SessionData["SomeKey"] != null)
{
    // Повторно выполняется сетевое обращение и десериализация данных.
    UserConnection.SessionData.Remove("SomeKey");
}

Оптимальный код:

// Удаление выполняется сразу, без предварительной проверки.
UserConnection.SessionData.Remove("SomeKey");

3. Необходимо понимать, что любые изменения состояния объекта, полученного из хранилища или кэша, происходят локально в памяти и не фиксируются в хранилище автоматически. Поэтому, чтобы эти изменения отобразились в хранилище, измененный объект необходимо явно в него записать (пример 3).

Пример 3

// Получение словаря значений из хранилища данных сессии по ключу "SomeDictionary".
Dictionary<string, string> dic = (Dictionary<string, string>)UserConnection.SessionData["SomeDictionary"];

// Изменение значения элемента словаря. Изменения в хранилище не зафиксировались.
dic["Key"] = "ChangedValue";

// Добавление нового элемента в словарь. Изменения в хранилище не зафиксировались.
dic.Add("NewKey", "NewValue");

// В хранилище данных по ключу "SomeDictionary" записывается словарь. Теперь все внесенные изменения 
// зафиксированы в хранилище.
UserConnection.SessionData["SomeDictionary"] = dic;

© Terrasoft 2002-2020.

Был ли данный материал полезен?

Как можно улучшить эту статью?