Delphi.FireDAC. Оффлайн режим

Данная статья о работе в режиме Оффлайн  с БД. Идея в том, чтобы большую часть времени работать без соединения с базой данных. А с базой соединяться только тогда, когда нужно. Ведь и правда, есть такие задачи, для которых режим оффлайн был бы идеальным – нестабильная сеть или ограниченные вычислительные ресурсы.  Основа данной статьи – официальная документация

-старая версия

-новая версия

Включение Оффлайн режима

Здесь все достаточно просто. Для того, чтобы включить режим оффлайн, необходимо

-Вызвать TFDCustomConnection.Offline метод

-Присвоить параметру AAction метода FDCustomConnection.OnRecovery значение faOfflineAbort

По поводу последнего параметра в справке написано следующее

5

То есть, это выглядело бы таким образом

Интересный момент!

Все активные датасеты, перед уходом в оффлайн “фетчатся” (получаются) в зависимости от настроек свойства  FetchOptions.AutoFetchAll, по умолчанию там стоит afAll. То есть, говоря по русски – все множества загружаются полностью до ухода в оффлайн. На мой взгляд, это хорошо для небольших множеств в 100,200 – 1000 записей, а вот если там под 1000 000 записей, то придется выкручиваться и ставить другой режим, например afDisabled.

Выключение Оффлайн режима

-Явный вызов TFDCustomConnection.Online

-Неявная активация, когда приложению нужно “пообщаться” с БД, например отправить обновления, команду на выполнение и так далее

При этом  ResourceOptions.AutoConnect свойство должно быть поставлено в True.

Практика

Тестируем включение / выключение оффлайн режима

Для начала напишем приложение, которое двумя способами уходит в оффлайн и возвращается обратно. Используем опыт прошлых постов и кнопку bConnect обработаем следующим образом

В результате получим такое сообщение

6

Имитируем обрыв соединения

Теперь обработаем событие OnRecover таким образом

А сам обрыв соединения сделаем, отключив демона MySQL таким образом из cmd (под администратором)

В windows 8 можно сделать таким образом – нажать Ctrl X, далее выбрать “Командная строка (администратор)”, далее согласиться с диалоговым окном, набрать net stop MySQL. Можно также создать bat файл и написать там ту же самую инструкцию net stop MySQL, но запустить его нужно будет от имени администратора.

В этом случае от нашего приложения получим такой ответ

7

Работа с данными в оффлайн режиме

Теперь посмотрим как можно работать с данными в режиме оффлайн. Немного расширим нашу программу, таким образом.

8

Обработку кнопок сделаем следующую

Offline_Online

Open

Insert

Delete

ApplyUpdates

Здесь, для корректной работы нужно включить режим CachedUpdates

Режим FDQuery.CachedUpdates – режим кэширования обновлений

Очень интересный режим – по сути для тех задач, для которых нам не нужен постоянный многопользовательский доступ к одним и тем же данным мы можем кэшировать наши обновления и отправлять их одной партией. На мой взгляд, здесь нужно исходить из задачи, которая решается программистом.

Аналогом ему в DBExpress являлись компоненты SimpleDataSet и ClientDataSet.

Если мы работаем в режиме CachedUpdates, то код для Insert,Delete и др. методов нужно немного поменять и вставить туда ApplyUpdates(-1), примерно таким образом….

То есть обновления должны происходить до получения данных, до метода Open.

В принципе, программа показала, что если войти в Offline режим, а потом отправить команду insert, delete или open, то подключение к базе возобновляется автоматически. Режим кэширования обновлений может сильно снизить нагрузку на сеть для тех задач, где это возможно – там где не нужен постоянный много пользовательский доступ к базе данных, например доступ одного человека – администратора.


 

Исходники

Скачать исходники 213_FireDac_4

This entry was posted in Delphi, FireDAC, Без рубрики. Bookmark the permalink.