ZeosDBO + Firebird кэширование?
Модератор: Модераторы
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
wofs, я же и не говорю, что так делать не стоит. Просто проверь действительно ли это тот самый вариант, который тебя устраивает полностью... а то потом окажутся какие-нибудь неприятные спецэффекты и придется половину программы перетряхивать, чтобы найти.
Вон, только сегодня в который раз пришлось делать рефакторинг программы, так как не работает диалог выбора шрифтов под ХР. Может, конечно, это конкретно под этой установкой, но червячок остался(((
Вон, только сегодня в который раз пришлось делать рефакторинг программы, так как не работает диалог выбора шрифтов под ХР. Может, конечно, это конкретно под этой установкой, но червячок остался(((
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Лекс Айрин писал(а):Просто проверь действительно ли это тот самый вариант, который тебя устраивает полностью...
Я и не отрицаю того, что мне нужна помощь в решении проблемы.
Я просто привел вариант решения и с удовольствием выслушиваю критику, стараюсь делать выводы.
Я этот момент максимально отрежу от основного кода, что бы если появится более красивое решение - я заменю пару строк кода и делов то.
Удивляет то, что вроде тема работы с FireBird регулярно проскакивает на форуме, но никто даже не упоминал о такой проблеме. Хотя может никакой проблемы не существует и это банально непонимание принципов работы БД.
если память не изменяет: 2.Я думаю что одну на каждый запрос, если не указано иное.
Ну а по поводу как... А вы с ними (транзакциями) работаете? Или можно считать работой: "уставил/снял флаг в компоненте"?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
wofs писал(а):и это банально непонимание принципов работы БД.
Скорее, принципов сетевого взаимодействия.
wofs писал(а):но никто даже не упоминал о такой проблеме.
Потому что это не проблема при систематическом использовании компонента. Ну и самой СУБД.
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 данных так и останутся не внесёнными в базу.
Конечно, я это написал в самой простой форме, без учёта того, что там происходит на самом деле. Но как иллюстрация к транзакциям - вполне годится.
Настройка
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
- Откуда: Астрахань
- Контактная информация:
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
- Откуда: Урал
- Контактная информация:
В составе с компонентами есть такой компонент как IBEventAlerter, он позволяет регистрировать события и при их возникновении предпринимать какие-то действия. При обновлении данных в одном соединении, можно вызывать процедуру, которая всем клиентам разошлет событие и они будут знать что данные изменились и нужно обновить кэш. Это может работать если данные обновляются редко, если с таблицей работают 100 клиентов и меняют данные безостановочно такой вариант не подойдет. Лучше просто по таймеру вызывать обновление данных, если требуется видеть актуальные данные. А вообще ZEOS для FireBird не очень (имхо), лучше это: visual-t.ru/ibexpress.html
wofs, у ZeosDBO имеется свой подход, обобщенный многих баз данных.
Отсюда некоторые тонкости могут быть опущены. Плюс общий подход к работе с данными - общий интерфейс. Философия близка к микрософскому ODBC. Это очень удобно когда вам нужно работать с многими базами данных. Не надо вникать как формировать данные, как создавать запрос, как извлекать данные - для каждой либлы базданных может существовать свой подход.
ZeosDBO стремится все сложности и особенности поглотить в себя - а вам представить обобщенный подход.
Чтобы сделать
Требуются например для MySQL - более 10 операций, а для PostgreSQL - более 20, а для SQLite - 40 операций.
Вот чтобы уложится в две команды - ZeosDBO нужен.
Для одних баз нет явных указаний по транзакций. Для других таких как FireBird - обязательно нужно указывать какой вид транзакции для каждой операции.
Но ZeosDBO изначально настроен на простые варианты (AutoCommit:=true) поэтому изначально с FireBird он настроен на работу как с MySQL.
Поэтому, если вам нужно особый подход - то ZeosDBO нужно указывать на него.
Добавлено спустя 24 минуты 32 секунды:
Можно явно указывать ZQuery/ZTable начало транзакции и завершение..
Добавлено спустя 8 минут 21 секунду:
типа
Добавлено спустя 3 минуты 12 секунд:
Либо через
Добавлено спустя 3 минуты 1 секунду:
Есть TZIBEventAlerter
IBExpress - вроде не бесплатный?
Отсюда некоторые тонкости могут быть опущены. Плюс общий подход к работе с данными - общий интерфейс. Философия близка к микрософскому ODBC. Это очень удобно когда вам нужно работать с многими базами данных. Не надо вникать как формировать данные, как создавать запрос, как извлекать данные - для каждой либлы базданных может существовать свой подход.
ZeosDBO стремится все сложности и особенности поглотить в себя - а вам представить обобщенный подход.
Чтобы сделать
Код: Выделить всё
ZQuery.SQL.Text:='Select * from table1';
ZQuery.Open()
Вот чтобы уложится в две команды - 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 - вроде не бесплатный?
wofs писал(а):так?
Тут какая-то сложность с обработкой транзакций. Вообще, эта настройка касается нескольких транзакций сразу (параллельных или вложенных друг в друга), т.е. производится несколько операций с данными и каждая проходит в рамках отдельной транзакции. И тут такая настройка обеспечивает принудительное подтверждение транзакций. От настройки ZConnection.AutoCommit:=false; это не сильно зависит.
Я, наверное, неправильно Вам объяснил. ZConnection.AutoCommit - это обработка транзакций для одного единственного (или, если по другому сказать, однопользовательского) действия. У Вас таких действий с данными несколько и здесь как раз помогает решить этот нюанс ZConnection.TransactIsolationLevel.
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
*Rik* писал(а):ZEOS для FireBird не очень (имхо), лучше это: visual-t.ru/ibexpress.html
И правда - взлетело без плясок и с транзакциями работать просто. Спасибо! Буду наблюдать.
Всем, кто принял участие в топике - спасибо! Много нового почерпнул.
