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

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

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

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

Сообщение Лекс Айрин » 18.09.2017 19:58:48

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

Вон, только сегодня в который раз пришлось делать рефакторинг программы, так как не работает диалог выбора шрифтов под ХР. Может, конечно, это конкретно под этой установкой, но червячок остался(((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4017
Зарегистрирован: 19.02.2013 16:54:51

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

Сообщение wofs » 18.09.2017 20:05:51

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

Я и не отрицаю того, что мне нужна помощь в решении проблемы.
Я просто привел вариант решения и с удовольствием выслушиваю критику, стараюсь делать выводы.
Я этот момент максимально отрежу от основного кода, что бы если появится более красивое решение - я заменю пару строк кода и делов то.
Удивляет то, что вроде тема работы с FireBird регулярно проскакивает на форуме, но никто даже не упоминал о такой проблеме. Хотя может никакой проблемы не существует и это банально непонимание принципов работы БД.
Аватара пользователя
wofs
постоялец
 
Сообщения: 152
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение pupsik » 18.09.2017 22:36:07

Я думаю что одну на каждый запрос, если не указано иное.
если память не изменяет: 2.
Ну а по поводу как... А вы с ними (транзакциями) работаете? Или можно считать работой: "уставил/снял флаг в компоненте"?
pupsik
энтузиаст
 
Сообщения: 997
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение Лекс Айрин » 19.09.2017 09:14:37

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


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

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


Потому что это не проблема при систематическом использовании компонента. Ну и самой СУБД.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4017
Зарегистрирован: 19.02.2013 16:54:51

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

Сообщение Vadim » 19.09.2017 12:20:03

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 данных так и останутся не внесёнными в базу.
Конечно, я это написал в самой простой форме, без учёта того, что там происходит на самом деле. Но как иллюстрация к транзакциям - вполне годится.
Vadim
долгожитель
 
Сообщения: 2602
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение wofs » 19.09.2017 18:25:36

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.
Аватара пользователя
wofs
постоялец
 
Сообщения: 152
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение *Rik* » 19.09.2017 22:04:13

В составе с компонентами есть такой компонент как IBEventAlerter, он позволяет регистрировать события и при их возникновении предпринимать какие-то действия. При обновлении данных в одном соединении, можно вызывать процедуру, которая всем клиентам разошлет событие и они будут знать что данные изменились и нужно обновить кэш. Это может работать если данные обновляются редко, если с таблицей работают 100 клиентов и меняют данные безостановочно такой вариант не подойдет. Лучше просто по таймеру вызывать обновление данных, если требуется видеть актуальные данные. А вообще ZEOS для FireBird не очень (имхо), лучше это: visual-t.ru/ibexpress.html
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 350
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

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

Сообщение olegy123 » 19.09.2017 23:06:21

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 - вроде не бесплатный?
olegy123
энтузиаст
 
Сообщения: 645
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение Vadim » 20.09.2017 03:52:09

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

Тут какая-то сложность с обработкой транзакций. Вообще, эта настройка касается нескольких транзакций сразу (параллельных или вложенных друг в друга), т.е. производится несколько операций с данными и каждая проходит в рамках отдельной транзакции. И тут такая настройка обеспечивает принудительное подтверждение транзакций. От настройки ZConnection.AutoCommit:=false; это не сильно зависит.
Я, наверное, неправильно Вам объяснил. ZConnection.AutoCommit - это обработка транзакций для одного единственного (или, если по другому сказать, однопользовательского) действия. У Вас таких действий с данными несколько и здесь как раз помогает решить этот нюанс ZConnection.TransactIsolationLevel.
Vadim
долгожитель
 
Сообщения: 2602
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение *Rik* » 20.09.2017 14:48:22

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

Бесплатный. Interbase Public Licence.
Последний раз редактировалось *Rik* 21.09.2017 08:15:06, всего редактировалось 1 раз.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 350
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

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

Сообщение wofs » 20.09.2017 16:04:30

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

И правда - взлетело без плясок и с транзакциями работать просто. Спасибо! Буду наблюдать.
Всем, кто принял участие в топике - спасибо! Много нового почерпнул.
Аватара пользователя
wofs
постоялец
 
Сообщения: 152
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru