Ax2012. Кэширование таблиц

Кэширование записей

Кэширование записей базы данных Microsoft Dynamics AX 2012 — это функция для повышения производительности, которая помогает избежать доступа к базе данных, когда это не является необходимым. Извлечение записей из памяти вместо обращения к базе данных значительно ускоряет доступ к данным. Кэширование помогает снизить ограничение производительности для повторного доступа к тем же записям базы данных.

    Типы кеширования

Кэширование происходит прозрачно в приложении, однако важно знать, как работает кэширование для оптимизации производительности в Microsoft Dynamics.

Типы:

— одной записи;

— основного набора;

Кэширование одиночной записи

    Кэширование записей работает для таблицы, если выполняются следующие условия:

  1. Свойство «CacheLookup» должно иметь одно из следующих значений: NotInTTS, Found, FoundAndEmpty.
  2. Метод, буфера записи, «disableCache» не был вызван с параметром «true».

    Записи кэшируются для всех уникальных индексов, когда выполняются следующие критерии:

  3. Свойство «CacheLookup» должно иметь одно из следующих значений: NotInTTS, Found, FoundAndEmpty.
  4. Оператор select, который выбирает записи, использует оператор (==) для ключа кеширования. Поля в выражении where оператора select соответствуют полям в любом уникальном индексе.

Расположение кэша

    Кэши используются как на клиенте, так и на AOS. Среда Dynamics AX управляет кэшем, удаляя старые записи, когда новые записи добавляются в кэш.

Кэш на клиенте

   Кэш на клиентской стороне может использоваться только клиентом. Клиентский кэш используется, когда выборка запущена с клиентского уровня. Если запись не найдена в клиентском кэше, то происходит поиск в серверном кэше. Когда запись не найдена на сервере, то данные запрашиваются из базы данных. Можно конфигурировать количество записей, хранящихся в кэше используя форму Конфигурация сервера. Форма находится в рабочей области приложения по пути: System administration > Area page > Setup > System > Server configuration. В форме перейти в Performance Optimization > Performance Settings > Client record cache factor.

Кеш на сервере

    Кеш на серверной стороне может использоваться всеми подключенными клиентами. Серверный кэш используется, когда выборка запускается на уровне сервера. Если запись не найдена, то данные запрашиваются из базы данных. Можно настроить максимальное количество записей, которые хранятся в кэше сервера, используя раздел «Ограничения кэша» в форме Конфигурация сервера. Значение по умолчанию — 2000 записей для данной компании в группе таблиц или на AOS.

Расширенные возможности кэширования

  1. Дополнение к условиям where. Условия в where может быть построено на операторе Равенства (==) полей, которые входят в уникальные индексы. Дополнительно, теперь можно использовать другие поля и оператор И (&&) в условиях. Но кэширование не поддерживает оператор ИЛИ (||). Дополнения теперь не ухудшают производительность механизма кэширования.

    Пример

    select * from tabCustTable
        where tabCustTable.AccountNum == "4000"
           && tabCustTable.CustGroup == "Gold";

     

  2. Поддержка join. Теперь механизм кэширования поддерживает соединение таблиц в выборке. Для этого необходимо в условии использовать оператор Равенства (==) по полям уникального индекса присоединяемой таблицы.

    Пример

    select from tabCustTable join tabCustGroup
        where tabCustTable.AccountNum == "4000"
           && tabCustTable.CustGroup == tabCustGroup.CustGroup;

    Благодаря предыдущей выборке, следующий код будет обслужен кэшем

    select from tabCustGroup
        where tabCustGroup.CustGroup == "Gold";

     

  3. Запросы cross-company. Выборка, которая использует слово crossCompany в запросе, поддерживает кэширование, когда существует только одна компания.
  4. Тип поля «container». Кеширование поддерживается поле с типом контейнер, если для данного поля создан индекс.
  5. Наследование таблиц. Запросы к таблицам, которые поддерживают наследование, поддерживаются механизмом кэширования.
  6. Таблицы с историей состояний. Механизм кэширования поддерживает такие таблицы.

Свойство «CacheLookup»

    Данное свойство определяет, как и когда происходит кэширование записей.

  1. None – Данные не кэшируются и данные не извлекаются из кэша.

    Используется для таблиц, которые очень часто обновляются или где недопустимо получение устаревших данных.

  2. NotInTTS – все выполненные выборки, использующие кэшируемый ключ, кэшируются.

        Когда в транзакции (после ttsBegin) не используются кэши, сделанные вне транзакции. Когда внутри транзакции запись один раз читается из базы данных и после берется из кэша. Запись блокируется при чтении в транзакции, что гарантирует, что кэшированная запись не будет обновляться, пока транзакция активна.

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

  3. Found — все выполненные выборки, использующие кэшируемый ключ, кэшируются.

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

  4. FoundAndEmpty — все выборки, использующие кэшируемый ключ, кэшируются и которые не вернули данные тоже.

    Результат возвращается из кэша если запись существует или отмечена в кэше как несуществующая. Если в выборке используется ключевое слово forUpdate в транзакции, то данные принудительно запрашиваются из базы данных и обновляется запись в кэше.

    Например, для таблицы Скидок в приложении настроено кэширование FoundAndEmpty. Изначально таблица не имеет записей. Если сделать запрос к этой таблице, то записи не будут найдены, но ключ запроса будет помещен в кэш. И последующие запросы с такими условиями буду получать результат из кэша.

  5. EntireTable — создается основной набор кэширования (set-based caching) на сервере. Вся таблица кэшируется, как только по крайней мере одна запись будет выбрана из таблицы.

Границы транзакций для кэширования

    Кэш при использовании значений Found и FoundAndEmpty не сбрасывается при начале транзакции, т.е. он работает сквозь транзакцию. Если установлено значение NotInTTS, то в транзакции, первый запрос отправляется напрямую в базу данных и затем кэш обновляется.

Пример

static void NotInTTSCache(Args _args) // X++, in AOT > Jobs.
{
    CustTable custTable;

    // The query looks for a record in the cache.
    // If the record does not exist in the cache,
    // the query accesses the database.

    select custTable
        where custTable.AccountNum == '4000';

    // The transaction starts.

    ttsbegin;

    // The cache is not used. The query accesses the database
    // and a record is placed in the cache.

    select custTable
        where custTable.AccountNum == '4000';

    // The query uses the database because
    // the forupdate keyword is used.

    select forupdate custTable
        where custTable.AccountNum == '4000';

    // The query uses the cache and not the database.

    select custTable
        where custTable.AccountNum == '4000';

    // The query uses the cache because
    // the forupdate keyword was used previously.

    select forupdate custTable
        where custTable.AccountNum == '4000';

    // The transaction is committed.
    ttscommit;

    // The query will use the cache.
    select custTable
        where custTable.AccountNum == '4000';
}

Кэширование основного набора

    В Microsoft Dynamics AX группы записей можно кэшировать сразу, используя кэширование на основе набора. Кеширование на основе набора можно реализовать двумя способами:

  1. Во время разработки указать в свойстве CacheLookup значение EntireTable.
  2. В коде, используя класс RecordViewCache.

    Кэш EntireTable

    Вся таблица кэшируется, как только по крайней мере одна запись будет выбрана из таблицы. Данный тип кэширования следует правилам кэширования одной записи. Это означает, что в выражении SELECT оператор WHERE должен включать равенства во всех полях уникального индекса, которые определены в свойстве PrimaryIndex таблицы.

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

Очистка кэша EntireTable

    Кэш сбрасывается всякий раз, когда в таблице происходит вставка, обновление или удаление записи. В это же время, AOS оповещает другие AOS, что их кэш не актуальны и должен быть сброшен. После сброса кэша, последующие выборки пересоздадут его. Поэтому избегайте кэширования любой таблицы, которая часто обновляется. Независимо от того, когда сделаны обновления, кэши EntireTable очищаются каждые 24 часа на AOS.

    Язык Х++ имеет ключевое слово Flush. Предположим, что свойство CacheLookup в таблице установлено в EntireTable. Предположим, что обновляются данные в таблице с помощью механизма, такого как класс [Statement], который обходит AOS. В этом случае вы должны очистить кэш таблицы сразу после обновления данных.

Ключевое слово firstOnly

    Предположим, что оператор выбора X ++ SQL использует ключевое слово firstOnly. Если выбор выполняется кэшем EntireTable таблицы, ключевое слово firstOnly игнорируется.

Кэш RecordViewCache

    Кэширование на основе объектов реализовано в коде с помощью класса RecordViewCache. Сначала необходимо создать буфер записи, используя оператор nofetch, а затем передать буфер записи в класс RecordViewCache при его создании.

    Кэш создается на сервере и доступен только процессу, который создает объект кэша.

Пример

static void RecordViewCache(Args _args)
{
    CustTrans custTrans;
    RecordViewCache recordViewCache;

    // Define records to cache.
    select nofetch custTrans
        where custTrans.AccountNum == '4000';

    // Cache the records.
    recordViewCache = new RecordViewCache(custTrans);

    // Use cache.
    select firstonly custTrans
        where custTrans.AccountNum == '4000'
           && custTrans.CurrencyCode == 'USD';
}

   Из-за проблем с параллелизмом ключевое слово forUpdate в операторе X++ SELECT должно использоваться только тогда, когда все записи в наборе результатов будут обновлены. В противном случае лучше использовать select forUpdate только для записей, которые необходимо обновить.

    Класс RecordViewCache используется в выборе, когда выбор выбирается из кэшированной таблицы, оператор select не участвует в соединении, а предложение select WHERE соответствует предложению WHERE, с которым был создан экземпляр RecordViewCache.

    Кэш, созданный классом RecordViewCache, хранит записи в связанном списке. Поэтому Microsoft Dynamics AX последовательно ищет кэш для записей, соответствующих критериям поиска. Если оператор SELECT содержит предложение ORDER BY, временный индекс помещается в кэш, а среда выполнения использует индекс при поиске записей.

Кэширование display\edit методов

    Производительность методов может быть улучшена благодаря их кэшированию, если они рассчитаны на AOS. Кэширование улучшает производительность, когда записи передаются с сервера на клиента. Значение всех кэшированных методов устанавливается, когда данные извлекаются из внутренней базы данных. Кроме того, значение обновляется, когда вызывается метод reread в источнике данных формы.

Чтобы добавить метод в кэш есть разные способы:

  1. На форме, в источнике данных необходимо перекрыть метод init и написать в нем код вида FormDataSource.cacheAddMethod после метода super. В методе cacheAddMethod необходимо указать имя метода таблицы, который должен быть кэширован и вторым параметром указать, будет ли обновлен кэш метода, когда произойдет обновление записи в базе данных.

    Пример

    public void init()
    {
        super();
    
        ProjTable_ds.cacheAddMethod(tableMethodStr(ProjTable, projectCompletedDate), false);
    }

     

  2. спользовать атрибут SysClientCacheDataMethodAttribute при объявлении display метода. Конструктор атрибута принимает единственный параметр _updateOnWrite, который указывает обновлять кэш при обновлении записи в базе данных.

    Пример

    [SysClientCacheDataMethodAttribute]
    public display EcoResProductTitle title()
    {
        return inventTable.product().title();
    }

  3. Использовать свойство CacheDataMethod у элемента управления на форме.

Очистка кэша из ОС

  1. Close the client or Stop the AOS
  2. Press Windows Key + R
  3. Command %userprofile% in Run and press enter
  4. Unhide the system files
  5. Locate the AppData folder
  6. The ax_{GUID}.auc file is now written to the AppData folder
  7. Delete the .auc file
  8. Open the client or Start the AOS.

Job для очистки кэша из среды разработки

В примере поочередно запускаются функции, которые можно также по отдельности вызывать в среде разработки из Сервис -> Кэши.

Пример

static void RefreshLocalCache(Args _args)
{
    //report server
    new MenuFunction(menuItemActionStr(SysFlushReportServer), MenuItemType::Action).run();

    // dictionary
    new MenuFunction(menuItemActionStr(SysFlushDictionary), MenuItemType::Action).run();

    // data
    new MenuFunction(menuItemActionStr(SysFlushData), MenuItemType::Action).run();

    // elements
    new MenuFunction(menuItemActionStr(SysFlushAOD), MenuItemType::Action).run();
}

или

static void RefreshLocalCache(Args _args)
{
    xSession::removeAOC();
    SysTreeNode::refreshAll();
    SysFlushDictionary::main(null);
    SysFlushAOD::main(null);
    SysFlushData::main(null);
    SysBPCheckAIFDataObject::flushCache(true);
    SysFlushReportServer::main(null);
    SysFlushSystemSequence::main(null);
    xSession::updateAOC();
}

Для очистки кэша AOS из среды разработки необходимо создать копии пунктов меню:

  1. SysFlushDictionary
  2. SysFlushData
  3. SysFlushAOD

Для вновь созданных пунктов меню в свойстве RunOn проставить значение Server.

microsoft.com

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar