Управление режимом загрузки данных и кэширование

Режим загрузки данных устанавливается для всех секций карточки на этапе создания её схемы, но может быть переопределен свойствами: CardData.FetchMode (действует на всю карточку) и SectionData.FetchMode (действует на конкретную секцию).

В приведенном примере Схема карточки определяет механизм загрузки её данных из базы данных, Схема карточки определяет режим загрузки её данных из базы данных.

Для сценариев, связанных с получением данных карточки, актуально такое понятие, как режим загрузки данных, который определяет порцию информации, загружаемой с сервера Docsvision, за одно обращение. Режим загрузки может иметь одно из следующих значений (см. описание перечисления FetchMode):

  • Card — будут загружены данные всех секций карточки (актуально только для карточки в целом).

  • Section — при обращении к какой-либо строке секции будут загружены все её строки, в т.ч. данные её подсекций.

  • SubSection — будут загружены данные одной подсекции, к которой идет обращение.

  • Level — будут загружены данные только запрашиваемого уровня иерархической секции.

Для повышения производительности данные читаются не по одной строке, а блоками — уровнями или подсекциями. Сделано это из соображений о том, что задержки на передачу данных содержат в себе константу — стоимость сетевого вызова. Таким образом, иногда выгоднее получить больше данных за один раз, чем несколько раз обращаться к серверу за маленькими порциями.

С другой стороны, могут существовать карточки, которые содержат сотни тысяч строк (например, справочники). Попытка загрузить все данные такой карточки за один вызов приведёт к чрезмерной задержке, поэтому в такой ситуации более оптимальным было бы получать данные меньшими порциями по мере их востребованности.

Режим загрузки данных определяется для всей карточки в целом на этапе создания схемы данных в программе "CardManager", входящей в Resource Kit и распространяется на все её секции. Однако, в режиме исполнения (runtime) разработчик может переопределить это поведение (для карточки или для конкретных секций). Для этого служит свойство FetchMode объектов CardData и SectionData.

Режим построчной загрузки (FetchMode.Row) в данный момент не реализован. Однако получить данные для отдельных строк все же можно. Для этого у объекта SectionData есть набор методов, работающих с одиночной строкой. Их использование позволяет не загружать на клиента ненужную информацию, что, конечно же, предпочтительнее с точки зрения производительности.

В зависимости от того к каким данным карточки требуется доступ, можно выделить несколько объектов реализующих его:
  • CardData — точка входа к основным данным карточки (контейнеру).

  • SectionData — доступ к секциям карточки.

  • SubSectionData — доступ к подсекциям карточки.

Кэширование данных

Говоря про загрузку данных, нельзя не упомянуть про кэширование. В ObjectManager имеется кэш на чтение и, таким образом, повторное чтение строк вернёт уже загруженные данные. При этом надо понимать, что строки в кэше могли быть изменены на сервере, а это может привести к тому, что на клиенте окажутся неактуальные данные.

Для этого в ObjectManager предусмотрен механизм обновления строк:
  • Явный — у всех объектов есть метод Refresh (возможно, с параметрами), с помощью которого можно обновить данные вручную.

  • Неявный — при получении карточки (CardData) производится проверка наличия данных карточки в кэше. Если данные есть, но они потеряли актуальность, например на сервере произошло изменение строки, принадлежащей карточке, вызывается процедура обновления.

Неявный характер обновления данных во втором случае нужно всегда иметь в виду и избегать частого повторного получения данных карточки. В этом случае всегда производится серверный вызов — обновляется информация о статусе карточки (если такая карточка уже получалась ранее).

Существует также возможность очистить весь кэш одним вызовом — для этого предназначен метод PurgeCache экземпляра CardManager.