один. концепция
В сетевой среде приложение базы данных представляет собой C/S или многослойную структуру. В этой среде разработка приложений баз данных должна учитывать как можно больше сокращения объема передачи сетевых данных и максимально улучшить параллелизм. Основываясь на этой цели, технология обновления кэшированных данных возникла Работа завершена, данные отправляются в базу данных за одно время в подходящее время, что значительно уменьшает сетевой трафик, уменьшает нагрузку на сервере базы данных и повышает производительность параллелизма.
Следует сказать, что это не очень новая технология. Тем не менее, автор обнаружил, что некоторые программисты не обращают внимания на рациональное использование этой технологии и все еще остаются под идеей отдельных приложений, что приводит к неэффективности или потенциальным ошибкам в составленных программах. Следовательно, необходимо суммировать преимущества, принципы и методы применения этой технологии (в качестве примера, взяв Delphi).
два. Плюсы и минусы
Технология обновления данных с Cache имеет следующие преимущества:
(1) Минимизировать сетевой трафик и сократить время доступа к данным. Повышение эффективности операторов базы данных клиентов.
(2) Снижает бремя на сервере базы данных, потому что многие повторяющиеся обновления, модификации и операции удаления могут быть завершены в буфере клиента, а результаты в конце концов отправляются на сервер.
(3) эффективно снижать время обработки транзакций и снизить пропускную способность параллельных транзакций. Это может лучше обеспечить согласованность базы данных.
Мы можем привести пример, чтобы проиллюстрировать его превосходство: оператор базы данных вводит запись данных в базу данных, но сразу обнаруживает, что запись не соответствует требованиям, поэтому он удаляет данные. В этом процессе, если используется технология обновления данных без буфера, сторона сервера выполнит одну операцию вставки и одну операцию удаления и проведет две передачи данных в обратном направлении на стороне клиента и сервера, и если такие данные используются с Другие таблицы базы данных. Если метод обновления данных применяется с помощью кэша, эти два этапа обратных операций могут быть завершены в буфере данных клиента без каких -либо действий на стороне сервера, а также не будет сгенерировано передача сетевых данных и каскадное обновление данных. Это показывает огромные преимущества технологии обновления данных буферизации.
Одним из недостатков обновления данных с помощью кэша является то, что данные хранятся в клиенте, если данные изменяются другими пользователями, это вызовет противоречивые ситуации, такие как потеря и модификация. Полностью рассмотрим переменные. Применение этой технологии требует определенных навыков и определенных изменений мышления.
три. Принципы применения
Преимущества любой технологии отражаются в определенной среде.
(1) C/S или многослойные приложения базы данных. В этом случае сетевой трафик может быть эффективно уменьшен. В отдельной ситуации технология не имеет смысла.
(2) В случае обновления данных нескольких таблиц. Например, в обновлении основной структуры таблицы/детализации добавление и удаление двух таблиц часто влияют друг на друга. Это эффективно сокращает время транзакции и лучше обеспечивает согласованность данных.
(3) В случае, когда емкость загрузки сервера ограничена. В настоящее время, с увеличением скорости ПК и снижением цены, разница в возможностях клиентов и серверов становится все меньше и меньше, а возможности сервисных серверов относительно снижаются. Объективно, необходимо уменьшить бремя на сервере с точки зрения программного обеспечения, в то время как обновления буферизованных данных уменьшают бремя на сервере, поделившись частью задачи обновления клиентом.
(4) В случае, когда вероятность обновления данных одновременно относительно низкая. Если одни и те же данные в базе данных, вероятно, будут обновлены несколькими пользователями за тот же период, то эта ситуация не подходит для кэшированных обновлений, потому что в этом случае перезапись ошибок легко генерируется, что приводит к несоответствию данных.
Четыре Обзор методов управления в Delphi
Как популярный инструмент разработки базы данных, Delphi имеет богатые функции манипуляции с базой данных. Delphi обеспечивает комплексную поддержку технологии доступа за буферизацию. Как правило, Delphi предоставляет пользователям несколько элементов управления набором данных для доступа к таблицам базы данных, такими как Ttable и Tquery; Существует опция CachedUpdate в управлении свойствами набора данных. , только когда вызовут фактический метод (например, ApplyPdates () и т. Д.), Delphi отражает фактические представленные данные в базу данных. Будьте обновлены, когда таблица базы данных фактически обновляется. Это обеспечивает удобство для нас, чтобы самостоятельно управлять этапами представления данных. Более того, благодаря этой модели она значительно сокращает длину транзакций, уменьшает сетевой трафик и повышает надежность приложения. Ниже мы даем конкретный модуль приложения, чтобы проиллюстрировать, как использовать эту модель программирования.
пять. Пример программы Delphi
(1) Описание фона приложения
Предположим, мы делаем модуль для обработки заказа продукта. Этот модуль включает в себя три таблицы базы данных: Заказ таблицы заказа (с такими полями, как идентификатор заказа, сумма, дата дата, костомерная имени клиента и т. Д.), Подробная информация (с идентификатором заказа, идентификатор заказа и номер продукта CommondityId), заказ Подробная информация (с идентификатором заказа, идентификатором заказа и номером продукта CommondityId, количеству, ценам за единицу и других полях), хранилище таблицы запасов (включая номер продукта CommondityId, существующие акции и другие поля). Среди них порядок и список заказа-это отношения от одного ко многим, с номером заказа в качестве поля соединения. Всякий раз, когда добавляется заказ, таблица инвентаризации должна быть изменена, и количество продаваемых товаров вычитается из инвентаря.
(2) Описание программной структуры
Ниже приведена структура для программ Delphi, которая примерно объясняет, как использовать режим программирования обновлений кэша. Читатели могут самостоятельно улучшить функции этой программы.
Единый заказ;
{Имя блока}
интерфейс
Использование
{ссылка на модуль}
Windows, сообщения, Sysutils, варианты, классы, графика, управления, формы,
Диалоги, сетки, dbgrids, extctrls, dbctrls, toolwin, actnman, actnctrls,
Actnmenus, DB, dbtables;
Тип
{Объявленные переменные, добавленные элементы управления и определенные методы и процедуры}
Torderform = class (tform)
Tborder: ttable;
Tbdetail: ttable;
OrderDB: tdatabase;
ActionMainmenubar1: TactionMainmenubar;
Dbnavigator1: tdbnavigator;
Dbgrid1: tdbgrid;
Процедура tborderafterpost (набор данных: tdataset);
Процедура tbdetailNewRecord (набор данных: tdataset);
Процедура tbdetailupdaterecord (набор данных: tdataset;
UpdateKind: Tupdatekind;
Процедура tbdetailafterpost (набор данных: tdataset);
Процедура FormCreate (отправитель: Tobject);
Частный
{Частные объявления}
публичный
{Публичные объявления}
конец;
вар
Заказ: Torderform;
Выполнение
{$ R *.dfm}
{Ниже приведен основная программа}
Процедура torderform.formcreate (отправитель: tobject);
{Установите параметры обновления кэша для основной таблицы и подробной таблицы в True}
Начинать
Tborder.cachedupdates: = true;
Tbdetail.cachedupdates: = true;
конец;
Процедура torderform.tborderafterpost (набор данных: tdataset);
{После отправки обновления таблицы заказов выполните содержание этого процесса.
ПРИМЕЧАНИЕ. Если свойство набора данных CachedUpdates на наборе данных верно,
Тогда действие пост - это просто совершение в клиентском буфере.
Вместо того, чтобы фактически отправлять его в фактическую базу данных. Для достижения истинного коммита,
Заявление ApplipUpdates требуется. }
Начинать
OrderDb.StartTransaction; // Транзакция об обновлении запускает выполнение
пытаться
Tborder.applyupdates; // Пожалуйста, актуально обновить в основной таблице
Tbdetail.applyupdates; // Реальные обновления в подробном списке
кроме
OrderDB.Rollback; // Если происходит авария, отмените транзакцию и выйдите из процесса
Выход;
конец;
Orderdb.commit; // Если не произойдет случайность, то завершите коммит транзакций
Tborder.commitupdates; // очистить клиентский буфер таблицы Tborder
Tbdetail.commitupdates; // Очистить клиентский буфер таблицы tbdetail
конец;
Процедура torderform.tbdetailnewRecord (набор данных: tdataset);
{Действие завершено, когда добавлен подробный список. }
Начинать
Tbdetail.fieldbyname ('orderid'). Asinteger: = tborder.fieldbyname ('orderid'). Asinteger;
Файл: // Присвоить поле OrderID основной таблицы в поле OrderID подробной таблицы.
конец;
Процедура torderform.tbdetailupdaterecord (набор данных: tdataset;
UpdateKind: Tupdatekind;
{Когда таблица базы данных фактически обновляется, операции, которые необходимо выполнять одновременно, определены в событии OnuPdatereCord.
В этом случае выполняется каскадная операция обновления подробного списка и таблицы инвентаризации.
Обратите внимание: операции, выполняемые в этом процессе, являются действиями, выполняемыми, когда база данных фактически обновляется.
Вместо действий, выполняемых при обновлении кэшированных данных клиента}
Var temp_query: tquery;
Начинать
Если UpdateKind = ukinsert, то File: // Если тип обновления должен вставить новую запись, то обновите соответствующую сумму инвентаря
с Temp_Query Do
Начинать
закрывать;
Sql.clear;
SQL.Add ('Обновление набора хранилища акций = акции-: sumber');
Sql.add ('где commondityid =: commondityid');
parambyName ('ut alem'): = tborder.fieldbyname ('ut alem'). Asfloat;
ParambyName ('commondityId'): = tbdetai.fieldbyName ('commondityId'). AsInteger;
execSQL;
конец;
конец;
Процедура torderform.tbdetailafterpost (набор данных: tdataset);
{После изменения записей в подробной таблице и отправки (post) выполните операторы в этом процессе.
Обратите внимание: этот вид подчинения нацелен на данные клиента и на самом деле не отражается в базе данных.
В этом примере реализованная функция состоит в том, чтобы вычислить поле общей суммы основной таблицы}
Начинать
Tborder.fieldbyname ('Money'): = 0;
с tbdetail do
Начинать
первый;
в то время как не ЭФ
Начинать
Tborder.fieldbyname ('money'): = tborder.fieldbyname ('Money')+
FieldByName ('Price'). Asfloat*FieldByName ('Sutr');
Файл: // Накопленный объем подробной таблицы в поле суммы основной таблицы
следующий;
конец;
конец;
конец;
конец.