ZeosDBO + Firebird кэширование?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

wofs, я же и не говорю, что так делать не стоит. Просто проверь действительно ли это тот самый вариант, который тебя устраивает полностью... а то потом окажутся какие-нибудь неприятные спецэффекты и придется половину программы перетряхивать, чтобы найти.

Вон, только сегодня в который раз пришлось делать рефакторинг программы, так как не работает диалог выбора шрифтов под ХР. Может, конечно, это конкретно под этой установкой, но червячок остался(((
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

Лекс Айрин писал(а):Просто проверь действительно ли это тот самый вариант, который тебя устраивает полностью...

Я и не отрицаю того, что мне нужна помощь в решении проблемы.
Я просто привел вариант решения и с удовольствием выслушиваю критику, стараюсь делать выводы.
Я этот момент максимально отрежу от основного кода, что бы если появится более красивое решение - я заменю пару строк кода и делов то.
Удивляет то, что вроде тема работы с FireBird регулярно проскакивает на форуме, но никто даже не упоминал о такой проблеме. Хотя может никакой проблемы не существует и это банально непонимание принципов работы БД.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Я думаю что одну на каждый запрос, если не указано иное.
если память не изменяет: 2.
Ну а по поводу как... А вы с ними (транзакциями) работаете? Или можно считать работой: "уставил/снял флаг в компоненте"?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

wofs писал(а):и это банально непонимание принципов работы БД.


Скорее, принципов сетевого взаимодействия.

wofs писал(а):но никто даже не упоминал о такой проблеме.


Потому что это не проблема при систематическом использовании компонента. Ну и самой СУБД.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

wofs
Настройка
ZConnection.TransactIsolationLevel:=tiReadCommitted;
говорит о том, что как только Вы перемещаетесь на другую строчку Вашего набора данных (а набор данных, при этом, был в каком-либо состоянии изменения данных (например, bsInsert), то происходит автоматическое подтверждение автоматически начатой транзакции. Автоматические транзакции - это как раз Ваш случай, рах вы ими явно не управляете. Т.е. изменённые данные из Вашего набора данных передаются обратно на сервер. Дальше ими уже занимается сам FB и вам до него нет никакого дела. Эта настройка очень удобна, когда Вы, условно говоря, меняете свои данные в час по чайной ложке. Однако при массовых изменениях данных, время обмена данными резко увеличивается. Далее я буду приводить цифры чисто условные, просто для иллюстрации:
- Время открытия транзакции для изменения данных - 1 секунда;
- Время изменения данных - 3 секунд;
- Время закрытия транзакции с передачей изменённых данных на сервер - 2 секунды.
Если Вы меняете 10 данных, то общее время работы - (1+3+2)*10 = 60 секунд.
Если Вы меняете 10 000 данных, то (1+3+2)*10000 = 60 000 секунд.
Окончания изменения дождётесь только изгрызя себе ногти до самых локтей. Можно ли ускорить? Да, можно, убрав автоматическую обработку транзакций. Если делать вручную, то транзакцию мы открываем только вначале группового изменения, а закрываем только в конце группового изменения. Таким образом у нас из суммы времён убирается по три секунды на каждое изменение и получается 1+(3*10000)+2 = 30 003 секунды. Согласитесь, это заметное преимущество по времени. Конечно при этом, в случае каких-то проблем, когда транзакцию невозможно корректно завершить, все 10 000 данных так и останутся не внесёнными в базу.
Конечно, я это написал в самой простой форме, без учёта того, что там происходит на самом деле. Но как иллюстрация к транзакциям - вполне годится.
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

pupsik писал(а):Ну а по поводу как... А вы с ними (транзакциями) работаете? Или можно считать работой: "уставил/снял флаг в компоненте"?


С MySQL можно было вызвать в самом запросе начало и окончание транзакции

Код: Выделить всё

BEGIN TRANSACTION;
INSERT INTO Table (ID);
COMMIT;

FireBird же послал меня лесом со словами DSQL Error.
Единственный способ закрыть транзакцию вручную я нашел такой

Код: Выделить всё

ZConnect.Commit;


Vadim писал(а):ZConnection.TransactIsolationLevel:=tiReadCommitted;
говорит о том, что как только Вы перемещаетесь на другую строчку Вашего набора данных (а набор данных, при этом, был в каком-либо состоянии изменения данных (например, bsInsert), то происходит автоматическое подтверждение автоматически начатой транзакции.

То есть ZConnection игнорирует настройку (http://www.freepascal.ru/forum/viewtopic.php?f=5&t=25418&sid=63c22bd22e96119079b4ce8558a57c6c#p125528):

Код: Выделить всё

ZConnection.AutoCommit:=false;

и мое указание на закрытие транзакции после вставки данных:

Код: Выделить всё

ZConnection.Commit;

так?
Vadim писал(а):Эта настройка очень удобна, когда Вы, условно говоря, меняете свои данные в час по чайной ложке. Однако при массовых изменениях данных, время обмена данными резко увеличивается.

Потому то я и здесь.
Задача проста - жахнули серию изменений в одном соединении, сразу коммит. И эти изменения я должен увидеть во втором подключенном соединении, просто обновив запрос выборки. Ее я и пытаюсь решить.
Я представляю как это надо сделать, я не могу понять как это сделать в связке ZeosDBO+FireBird.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

В составе с компонентами есть такой компонент как IBEventAlerter, он позволяет регистрировать события и при их возникновении предпринимать какие-то действия. При обновлении данных в одном соединении, можно вызывать процедуру, которая всем клиентам разошлет событие и они будут знать что данные изменились и нужно обновить кэш. Это может работать если данные обновляются редко, если с таблицей работают 100 клиентов и меняют данные безостановочно такой вариант не подойдет. Лучше просто по таймеру вызывать обновление данных, если требуется видеть актуальные данные. А вообще ZEOS для FireBird не очень (имхо), лучше это: visual-t.ru/ibexpress.html
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

wofs, у ZeosDBO имеется свой подход, обобщенный многих баз данных.
Отсюда некоторые тонкости могут быть опущены. Плюс общий подход к работе с данными - общий интерфейс. Философия близка к микрософскому ODBC. Это очень удобно когда вам нужно работать с многими базами данных. Не надо вникать как формировать данные, как создавать запрос, как извлекать данные - для каждой либлы базданных может существовать свой подход.
ZeosDBO стремится все сложности и особенности поглотить в себя - а вам представить обобщенный подход.
Чтобы сделать

Код: Выделить всё

ZQuery.SQL.Text:='Select * from table1';
ZQuery.Open()
Требуются например для MySQL - более 10 операций, а для PostgreSQL - более 20, а для SQLite - 40 операций.
Вот чтобы уложится в две команды - ZeosDBO нужен.
Для одних баз нет явных указаний по транзакций. Для других таких как FireBird - обязательно нужно указывать какой вид транзакции для каждой операции.
Но ZeosDBO изначально настроен на простые варианты (AutoCommit:=true) поэтому изначально с FireBird он настроен на работу как с MySQL.

Поэтому, если вам нужно особый подход - то ZeosDBO нужно указывать на него.

Добавлено спустя 24 минуты 32 секунды:
wofs писал(а):Задача проста - жахнули серию изменений в одном соединении, сразу коммит. И эти изменения я должен увидеть во втором подключенном соединении, просто обновив запрос выборки. Ее я и пытаюсь решить.
Я представляю как это надо сделать, я не могу понять как это сделать в связке ZeosDBO+FireBird.

Можно явно указывать ZQuery/ZTable начало транзакции и завершение..

Добавлено спустя 8 минут 21 секунду:
типа

Код: Выделить всё

ZQuery.InsertSQL.Text:='
SET TRANSACTION READ WRITE NO WAIT READ COMMITTED RECORD_VERSION
Insert ..
COMMIT;
';


Добавлено спустя 3 минуты 12 секунд:
Либо через

Код: Выделить всё

ZQuery.BeforeInsert:
ZConnection.StartTransaction;

ZQuery.AfterInsert:
ZConnection.Commit;


Добавлено спустя 3 минуты 1 секунду:
*Rik* писал(а):IBEventAlerter

Есть TZIBEventAlerter

IBExpress - вроде не бесплатный?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

wofs писал(а):так?

Тут какая-то сложность с обработкой транзакций. Вообще, эта настройка касается нескольких транзакций сразу (параллельных или вложенных друг в друга), т.е. производится несколько операций с данными и каждая проходит в рамках отдельной транзакции. И тут такая настройка обеспечивает принудительное подтверждение транзакций. От настройки ZConnection.AutoCommit:=false; это не сильно зависит.
Я, наверное, неправильно Вам объяснил. ZConnection.AutoCommit - это обработка транзакций для одного единственного (или, если по другому сказать, однопользовательского) действия. У Вас таких действий с данными несколько и здесь как раз помогает решить этот нюанс ZConnection.TransactIsolationLevel.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

olegy123 писал(а):IBExpress - вроде не бесплатный?

Бесплатный. Interbase Public Licence.
Последний раз редактировалось *Rik* 21.09.2017 07:15:06, всего редактировалось 1 раз.
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

*Rik* писал(а):ZEOS для FireBird не очень (имхо), лучше это: visual-t.ru/ibexpress.html

И правда - взлетело без плясок и с транзакциями работать просто. Спасибо! Буду наблюдать.
Всем, кто принял участие в топике - спасибо! Много нового почерпнул.
Ответить