|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Есть проблема в синхронизации данных между несколькими клиентами. Клиенты имеют списки, например: список неиспользованных бланков, список договоров и т.д., которые загружаются из БД. Например, один клиент резервирует бланк или добавляет страховую компанию. Второй клиент должен это отобразить. Наиболее удобно, я так думаю, было бы оповещение всех клиентов сервером. Но, вряд ли это возможно. Т.е., как я думаю, нужно делать опрос сервера через определённый временной интервал. Но я не могу полностью перестраивать все списки. Или даже списки на активной странице. Если даже полностью перестраивать дерево компаний, будет видно мелькание. Т.е., я сейчас думаю так, что сервер, по триггерам должен записывать в некую таблицу все добавления/изменения/удаления каждой таблицы, которую клиент может изменить. В общем-то, такая задача, наверное, достаточно распространена. Но вот я не знаю откуда подступиться. Отсюда два вопроса: 1.) Возможно ли сделать оповещение клиентов сервером? 2.) Вариант с таблицей выгляди монструозным. Возможно ли как-то приемлемо реализовать такой вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2010, 23:06 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, http://www.postgresql.org/docs/8.4/static/sql-listen.html чтоб "не мигало" обновление таблиц при частых изменениях - можно сделать отложенный перезапрос таблицы на клиенте ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 08:08 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
http://www.postgresql.org/docs/8.4/static/sql-listen.html Блин, забыл. У меня MySQL. Там нет LISTEN. :-( Сменить СУБД не могу. Во-первых, под неё уже почти всё написано, а времени нет. Во-вторых, на ней старая база. чтоб "не мигало" обновление таблиц при частых изменениях - можно сделать отложенный перезапрос таблицы на клиенте Дело не в перезапросе, а в обновлении интерфейса. Например, в перестроении дерева. Потому и нужны таблицы изменений, либо нотификация. С нотификацией половина проблемы решается. Но у меня не Postgres... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 10:30 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, я не понял, что и почему нужно резервировать\оповещать\блокировать? автороповещение всех клиентов сервером. Но, вряд ли это возможно. оповещение по изменению данных есть во всех "больших" серверах ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 10:31 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, плюнь - пусть кнопаку "Обновить" жмут ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 10:32 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
резервироватьх. Только пример. Есть дерево компаний. Компании выдают пустые бланки с номерами. Бланки отображаются в дереве. Иногда администратор может добавлять/удалять/изменять компании. Это должно отобразиться у всех пользователей. Любой пользователь может завести договор, использовав пустой бланк. Бланк предварительно резервируется. Когда бланк использован или зарезервирован, он должен исчезнуть из дерева. оповещать Я говорил о чём-то типа событийного механизма. На клиенте есть обработчик, которому передаётся, что-то вроде результата запроса. "Изменилась такая-то сущность". блокировать? Это про бланки. оповещение по изменению данных есть во всех "больших" серверах В MySQL, похоже, нет. Хотя, может, я плохо искал. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 10:38 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
плюнь - пусть кнопаку "Обновить" жмут Учитывая, что времени в обрез, а написано где-то две трети - предложение вполне разумное. Но, по идее, - это не вариант. Долго будет производиться полное обновление. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 10:40 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_плюнь - пусть кнопаку "Обновить" жмут Учитывая, что времени в обрез, а написано где-то две трети - предложение вполне разумное. Но, по идее, - это не вариант. Долго будет производиться полное обновление. полное не надо. - В каждом ЯП есть виртуальные деревья - подзапросы на канкретные ветки при действиях пользователя. - ну и сервер узнать надо "на форуме сервера" ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 11:16 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
потом, при оповещении "от сервера" - увеличивается нагрузка на него (если он у тебя "маленький") ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 11:18 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
- В каждом ЯП есть виртуальные деревья - подзапросы на канкретные ветки при действиях пользователя. Хм.. Т.е., при раскрытии ветки? А, если ветка уже раскрыта? Проблема-то в этом... Ведь придётся по всему дереву проходить и проверять что обновилось/удалилось/изменилось..? Плюс, там же много списков и элементов отображения. Надо проверять есть ли такой элемент в списке, обновился ли, или удалён из БД. Есть ещё вариант, как вы говорите - делать обновление, без доп. таблицы. Просто хранить в каждой таблице, в т.ч. и справочнике, время обновления записи. Но, опять же... Пусть справочники весят 50 Кб (просто случайная цифра). Всего 6 пользователей (в одном офисе). За полное обновление все вытягивают 300 кб. Пусть обновление раз в три секунды. За минуту они вытянут 6 Мб. Нехилая нагрузка на сеть... Или таблица 1-5 Кб. Вполне приемлемо. - ну и сервер узнать надо "на форуме сервера" Предлагают написать это, как функцию на компилируемом языке. :-\ потом, при оповещении "от сервера" - увеличивается нагрузка на него (если он у тебя "маленький") Ну, в любом случае, нагрузка меньше, чем если бы каждый клиент "дёргал" сервер, например, раз в три секунды? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 12:46 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Да, сейчас размер справочников ~200 Кб на диске. Причём, БД ещё не полностью переделана на InnoDB. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 12:54 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, чё ты всё усложняешь? - если надо экономить трафик, то на триггер повесь аудит - на клиенте читай эту таблу аудита с параметром "оповещать через N секунд" - сами выберут через сколько оповещать - наверху формы бегущая строка - "изменился справочник AAAA" - сами решат стоит ли жать пимпу "Обновить форму" ЗЫ. Любят программисты всё решать за пользователей. Ты на форуме сам жмёшь F5 ? Или за тебя решил MS ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 13:23 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Нужно интерфейс пересматривать. Например, зачем пытаться резервировать самому пустой бланк? Пусть у пользователя будет кнопка "Зарезервировать бланк", на которую сервер при наличии свободных сам его зарезервирует. Тогда и большие справочники на странице не нужны, и с обновлением нет вопросов. Да и авторефреш данных, в действительно оперативных системах, тоже не плохо и не сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 13:25 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
2Petro123 : чё ты всё усложняешь? Дык, как всегда... - если надо экономить трафик, то на триггер повесь аудит Про то и думаю. Вот только, на какой триггер? Придётся для каждой таблицы... Хотя, есть ещё планировщик. С помощью него возможно запускать процедуру "централизованно" через интервал. Но тут, - хуже, я думаю. - на клиенте читай эту таблу аудита с параметром "оповещать через N секунд" По таймеру? - сами выберут через сколько оповещать Ну, это ясно, что настраиваемый параметр. Только, я думаю, на администратора повесить. - наверху формы бегущая строка - "изменился справочник AAAA" Хм... По-идее, возможно... - сами решат стоит ли жать пимпу "Обновить форму" Но, если справочник изменился, то всегда нужно обновлять. Какой смысл в информировании пользователя? Ведь, если сервер не позволяет использовать значения не из справочника, работать ничего не будет. А если позволяет, в данном случае, то будет работать некорректно. ЗЫ. Любят программисты всё решать за пользователей. Не равняйте по себе. Пользователи, в основном, - девушки-юристы (ну или как правильно)? Зачем возлагать на них нагрузку по решению вопроса о загрузке справочника? С другой стороны, не должно быть "томрозов" и мельканий, при работе... :-| Ты на форуме сам жмёшь F5 ? Я терпеть не могу, когда система что-то делает за меня. Но браузер - это браузер. А, даже Far взять. Представьте, что если бы в одной панели вы что-то удалили, а вторую пришлось обновлять вручную? Неудобно. Здесь - тоже самое. Или за тебя решил MS ? У меня firefu**s. prolis : Нужно интерфейс пересматривать. Интерфейс, конечно, придётся потом ещё пресмотреть. Но кардинальной перестройки я не планирую. Например, зачем пытаться резервировать самому пустой бланк? Пусть у пользователя будет кнопка "Зарезервировать бланк", на которую сервер при наличии свободных сам его зарезервирует. Так и есть. Только пользователю ещё предлагается выбрать бланк (серию/номер). Теоретически, бланки должны идти по порядку. Но, на практике, представьте что случитсяЮ если два пользователя взяли бланки одной компании и пошли на свои места. Или один пошёл пить кофе... Тогда и большие справочники на странице не нужны, и с обновлением нет вопросов. Там списки, а не всё содержимое справочников. Опишу, какие задачи я конкретно хочу решить. Т.е., например, список регионов, список коэффициентов, список марок ТС и т.д. Например, пришёл клиент, марка ТС, которого не занесена в БД. Какой-то пользователь, из группы, у которой есть права на изменение справочников, добавил марку ТС в справочник. У других пользователей марка ТС должна отобразиться в списке марок. Есть два случая: а.) Открытие соответствующего окна ("менеджера ТС"). б.) Окно уже открыто. В первом случае, я могу переформировать список. Но! Не так часто появляются клиенты, марки ТС которых, нет в справочнике. И ради этого формировать каждый раз список заново? Или даже просто загружать полный справочник? Это крайне неоптимально... З1. Как это сделать оптимально? Следующий пример: Есть страхователь и владелец ТС и их данные, отображённые в окне. Есть список водителей. Водители могут добавляться/изменяться через менеджер клиентов. В данном менеджере возможно изменить любого клиента, в т.ч. и того, который является страхователем. Т.е., в теории, может быть поменян страхователь или владелец. Надо отобразить изменения. Аналогично со списком водителей. Отслеживать изменения локально, вряд ли есть смысл, поскольку, в тоже время, любой клиент может быть поменян любым другим пользователем. З2. Как решить проблему соответствия отображаемых, локальных и серверных данных? Аналогично решается и с бланками, и с компаниями и т.д. Остаётся только понять как и, после сделать. :-\ Да и авторефреш данных, в действительно оперативных системах, тоже не плохо и не сложно. Вот только насчёт "несложно"... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 14:03 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_ 2Petro123 : чё ты всё усложняешь? Дык, как всегда... Т.е., например, список регионов, список коэффициентов, список марок ТС и т.д. Например, пришёл клиент, марка ТС, которого не занесена в БД. Какой-то пользователь, из группы, у которой есть права на изменение справочников, добавил марку ТС в справочник. У других пользователей марка ТС должна отобразиться в списке марок. Есть два случая: а.) Открытие соответствующего окна ("менеджера ТС"). б.) Окно уже открыто. В первом случае, я могу переформировать список. Но! Не так часто появляются клиенты, марки ТС которых, нет в справочнике. И ради этого формировать каждый раз список заново? Или даже просто загружать полный справочник? Это крайне неоптимально... ===== ты ни разу не писал клиент-сервера? Все так и делают - рядом с полем города - кнопка Справочник городов даже в вэбе грузят справочник на AJAX. А в клиент-сервере это вообще не обсуждается ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 14:50 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
===== ты ни разу не писал клиент-сервера? Все так и делают - рядом с полем города - кнопка Справочник городов Ну, как-бэ, могу за них порадоваться. Собственно, также и предыдущий клиент делал. даже в вэбе грузят справочник на AJAX. А в клиент-сервере это вообще не обсуждается Почему это не обсуждается? Потому что "все так делают"? Это критерий оптимальности? :-\ ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 15:31 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, есть понятие оптимальный, а есть рациональный. - нерационально делать Нестандартно (открывать справочник без нужды) - нерационально открывать справочник заранее и искать способы его обновления ps. тут был про это топик (кэш справочников на клиенте) imho ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 15:56 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, может отказаться от громоздких деревьев-справочников ? все таки они увеличивают мышевозюканье ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 17:00 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
905_no_test_, может отказаться от громоздких деревьев-справочников ? все таки они увеличивают мышевозюканье +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 19:41 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Petro123- нерационально открывать справочник заранее и искать способы его обновления Вот тут, пожалуй не соглашусь. 1. Данные открываемого справочника обязательно пригодятся, при пользовании программой. Пример: регионы. Если пользователь полноценно пользуется программой, он обязательно выберет регион. Из списка. Регион обязательно будет отображён, как выделенный пункт списка. Т.е., регионы нужны всегда. В течение рабочего дня, почти каждый пользователь полноценно пользуется программой. 2. Данные справочника почти никогда не меняются. Ну когда последний раз добавлялся или изменялся субъект федерации? 3. Пользователей несколько. Справочники весят не очень мало. Исходя из этого, я думаю, что данный справочник неоптимально перестраивать каждый раз заново. Да, конечно это проще. Но, в данном случае, не лучше. А справочник страховых компаний, вообще, строится по коллекции объектов. Т.е., надо разрушить все объекты коллекции, сделать перезапрос, пересоздать элементы, обновить список. Это долго и неоптимально. ps. тут был про это топик (кэш справочников на клиенте) Я читал. Но там ведь и была описана проблема, связанная с большой нагрузкой на сеть. В итоге - тормоза. 905может отказаться от громоздких деревьев-справочников ? все таки они увеличивают мышевозюканье Ну да, и код проще... Но там наиболее наглядно и удобно - дерево. Оно единственное в программе. Дерево компаний. Хотя, с ним и проблемы. Я не придумывал интерфейс с нуля, а взял за основу похожую программу, которая уже лет семь развивается. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 20:05 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, без скрина - обсуждение сферического коня в вакууме. при скрине, я уверен, тебе многие помогут. Если дерево большое то его нельзя тащить на клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 20:43 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Дерево не очень большое. Список компаний и бланки. Никуда не деться от его загрузки. Да и частично загружать, думаю, не нужно тут. Скрин скинул. Только, не готово ещё полностью, интерфейс не доработан и старые данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 21:10 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Блин, не приложился. :( Вот на df: http://depositfiles.com/files/tlcihs2gs ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 21:20 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
выбирай, или интерфейс менять, или более старшая БД или оптимизировать кодом до упаду. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 22:37 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
кстати, psqldeveloper грузит дерево за 1 сек. А обычная табла в 5 000 записей в сети грузится за 3-5 сек. Так что страхи твои сильно преувеличены (это тебе не вэб) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 22:59 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
выбирай, или интерфейс менять Не очень хороший вариант. Сам по себе, такой интерфейс удобный, в данном случае. более старшая БД 100 % - не вариант, поскольку тогда надо: 1.) Перегонять БД в другую СУБД (а там немало данных, потому и был выбран MySQL – он использовался в старом пакете, работа с пользователями, транзакции, ограничения по внешним ключам и прочие СУБД специфичные вещи). 2.) Переписывать и проверять серверную часть. Поскольку, хранимый код, всё-таки, специфичен. 3.) Немного переписывать клиента. 4.) Изучать новую СУБД. 5.) И т.д. или оптимизировать кодом до упаду. Остаётся только это. А обычная табла в 5 000 записей в сети грузится за 3-5 сек. С другой стороны, возможен «гибридный» вариант. Т.е., при изменении справочников полностью их перезаполнять. А изменения отслеживать по триггеру и хранить в отдельной таблице. Т.е., клиентский код упрощается. А, поскольку справочники изменяются редко, обновления также будут очень редкими. Короче, - обычное кэширование. К большому сожалению с деревом и вкладкой, которая на скриншоте, проблема не решается. :-( Вопрос что делать с ними? Так что страхи твои сильно преувеличены (это тебе не вэб) Это не «страхи», а стремление сделать по-человечески... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 15:20 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, кто мешает показывать правую сторону экрана только: - первый раз при открытии формы вкладка 0 - при клике на листе дерева - при клике на вкладке ? Зачем тебе кэш? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 15:39 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
кто мешает показывать правую сторону экрана только: Так и показывается. - первый раз при открытии формы вкладка 0 Ну да, только на вкладке 0 тоже есть списки. Даже, например, список "Класс бонус-малус" на вкладке 1. Если какой-то класс был удалён администратором, нужно перезаполнить список. Зачем тебе кэш? Я имею ввиду, кэш, не как отдельную сущность, а как "нормальное состояние". Т.е., например, "Класс бонус-малус" кэшируется в списке. Список просто не обновляется. Зачем его обновлять? Ведь, практически классы уже несколько лет не меняются (разве что, коэффициенты). Но, теоретически администратор может изменить этот справочник, используя клиент. Плюс, на вкладке 1, должен обновиться водитель в списке водителей, данные страхователя, данные владельца, при каком-либо их изменении. Сейчас подумал. Решил сделать нечто вроде такого: 1.) Сервер. Триггеры (AFTER) пишут в таблицу обновлений данные. Имя таблицы. Ключ записи. Если составной, то разделяется, к примеру, символом ';'. Время обновления. Действие или его код: update, insert, delete. Планировщик (или триггеры, пока не решил) удаляет все записи таблицы после опр. времени (больше времени обновления клиента). 2.) Клиент. Имеется объект "Диспетчер обновлений". Данный объект реализует: а.) Автоматическую загрузку таблицы обновлений. б.) Хранение времени последнего обновления таблиц. в.) Разбор ключа. г.) Сравнение времени обновления коллекции сущностей или списка записей с таблицей. д.) Генерацию событий, оповещающих об обновлении. Интерфейс подписан на события диспетчера и реализует обновления "отображения". Коллекции объектов хранят время последнего обновления. Не знаю, пока что, как будут управляться коллекции. Либо "через интерфейс", либо "напрямую" из диспетчера. Что скажете, стоит подобное делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 22:03 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_, у меня п.1 (аудит) так и сделан. П.2 решает заказчик, т.к. на 20-30 % удорожает систему. Есть ещё вариант оповещения если у тебя полный ООП на клиенте: - на F5 вешаешь Обновить ВСЮ форму с окнами - на create вкладка\сущность\панелька подписывается на флаг изменения у менеджера - по приходу события добавляет звёздочку в Caption = "Транспортное средство*" - пользователь видит звёзды, если не пьёт кофе - по желанию нажмёт F5 ЗЫ. я так понял, что у тебя система перестраивается на ходу админом? Это тоже просил заказчик? Или твоя фича? (я бы взял это на доработку\версии) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2010, 01:25 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
П.2 решает заказчик, т.к. на 20-30 % удорожает систему. Сколько?! Есть ещё вариант оповещения если у тебя полный ООП на клиенте Не полный, но сделать такое не сложно. ЗЫ. я так понял, что у тебя система перестраивается на ходу админом? Это тоже просил заказчик? Или твоя фича? (я бы взял это на доработку\версии) Моя фича. Изначально нужно было сделать не столь много: базовую функциональность (БД, печать бланков), напоминания и ограничения. Плюс, оставить данные БД из предыдущего клиента. Так вышло, что программа, как раз подошла на диплом. Т.е. я делаю без ТЗ и договора, и постепенно на меня пытаются навесить: "А вот бы ещё сделать печать заявлений, а неплохо бы, чтобы администратор в конце дня одобрял или не одобрял изменения, но это не обязательно, неплохо бы сделать сводную статистику по договорам." О цене я предварительно не договаривался. Спросил людей, сказали, что в районе 50 т.р. Видимо, заказчик на эту цену и рассчитывает... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2010, 00:17 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Я б так сделал: Сервер БД 1. Создаётся в базе табличка "Свежесть справочников" "Справочник"-"Время последнего обновления" 2. В базе создаётся табличка "Грохнутые элементы" "Справочник"-"ID_удалённого_элемента"-"Время удаления" В каждом справочнике добавляется столбец x_datetime, индексируется и навешиваются однитипные триггеры на справочники: - на вставку/обновление обновляет x_datetime - на удаление: добавляет строку в "Грохнутые элементы" в обоих триггерах обновляется "Свежесть справочников" --- Клиент 1. Открываем справочник "A" и перегоняем его в InMemory-Dataset, локальный индекс которого построен по первичному ключу. 2. Запрашиваем из таблицы "Свежесть справочников" дату обновления справочника "А" (или всех сразу с сохранением в памяти). Работа с этим мясом на стороне клиента При каждом обращении к справочнику "А" (открытие формы, нажатие на кнопку и пр.): 1. Делаем запрос к табличке "Свежесть справочников" и получаем дату последнего обновления "А" на сервере. При достаточной частоте этих запросов табличка помещается в горячий кэш сервера и живёт фактически в памяти, время отклика здесь не критично, 99% операций - чтение. 2. Сравниваем полученную с сервера дату с той датой, которую мы сохранили по этому справочнику, когда его открывали. 3. Если даты совпадают, то справочники не обновлялись, можно использовать существующие данные в InMemoryDatasete. 4. Если даты не совпадают, то справочники обновлялись, делаем следующее: - запрос select * from A where x_datetime > "Локальная дата обновления". Мы получим ТОЛЬКО новые и обновлённые записи. Их можно обработать локально по-разному, если закэшировать максимальный числовой идентификатор справочника, то можно чётко разделить, что добавлялось, а что обновлялось, новые записи добавляем в InMemoryDataset, обновлённые ищем локально по первичному ключу (локальному индексу) и обновляем. - запрос select * from "Грохнутые элементы" where "Справочник" = "A" and "Время удаления" > "Локальная дата обновления". В результате получим удалённые элементы ТОЛЬКО с момента последнего обновления справочников. Ищем их по индексу в InMemoryDS и удаляем. Последний штришок: сохраняем в локальную дату обновления справочника А дату, полученную на первом шаге. Если будете использовать эту технологию, советую оперативную таблицу с датами обновления помещать на стороне MySQL в табличный кэш на движке MemoryTable. На стороне клиента под это дело лучше использовать хэш-таблицу, т.к. это наиболее часто используемый функционал. Вот как-то так. В нюансы не вдавался по поводу возможности разрознения дат и пр., я попытался основу и суть технологии передать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2010, 14:31 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Подобная техника используется компонентами SDAC при обновлении результатов запроса (метод QuickRefresh) при соблюдении определённых правил на сервере... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2010, 14:37 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
_no_test_кто мешает показывать правую сторону экрана только: Так и показывается. - первый раз при открытии формы вкладка 0 Ну да, только на вкладке 0 тоже есть списки. Даже, например, список "Класс бонус-малус" на вкладке 1. Если какой-то класс был удалён администратором, нужно перезаполнить список. Зачем тебе кэш? Я имею ввиду, кэш, не как отдельную сущность, а как "нормальное состояние". Т.е., например, "Класс бонус-малус" кэшируется в списке. Список просто не обновляется. Зачем его обновлять? Ведь, практически классы уже несколько лет не меняются (разве что, коэффициенты). Но, теоретически администратор может изменить этот справочник, используя клиент. Плюс, на вкладке 1, должен обновиться водитель в списке водителей, данные страхователя, данные владельца, при каком-либо их изменении. Сейчас подумал. Решил сделать нечто вроде такого: 1.) Сервер. Триггеры (AFTER) пишут в таблицу обновлений данные. Имя таблицы. Ключ записи. Если составной, то разделяется, к примеру, символом ';'. Время обновления. Действие или его код: update, insert, delete. Планировщик (или триггеры, пока не решил) удаляет все записи таблицы после опр. времени (больше времени обновления клиента). 2.) Клиент. Имеется объект "Диспетчер обновлений". Данный объект реализует: а.) Автоматическую загрузку таблицы обновлений. б.) Хранение времени последнего обновления таблиц. в.) Разбор ключа. г.) Сравнение времени обновления коллекции сущностей или списка записей с таблицей. д.) Генерацию событий, оповещающих об обновлении. Интерфейс подписан на события диспетчера и реализует обновления "отображения". Коллекции объектов хранят время последнего обновления. Не знаю, пока что, как будут управляться коллекции. Либо "через интерфейс", либо "напрямую" из диспетчера. Что скажете, стоит подобное делать? Хм... прошу прощения, я почти то же самое описал, не углядев данного поста. В вашей сложившейся ситуации (переход невозможен и пр.) другого варианта не вижу... дерзайте)) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2010, 14:40 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Тут ещё идея в голову пришла, кэш справочником и датами обновлений можно на винт сохранять. Тогда, если справочник не обновлялся, он вообще с сервера запрашиваться целиком не будет, если есть на винте... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2010, 14:43 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Что-то идея сохранения справочников локально пахнет началом 90-хх, DOS-ом и поделками "файл-сервер" некоторых фирмочек. Экономия на спичках, ИМХО. В эру промышленных СКЛ-СУБД это неактуально. Экономия составит 0,5% трафика. Применяем подобное только для шаблонов кристал-отчетов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2010, 10:31 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
Имхо, что то не так с постановкой или с архитектурой. За все время время работы ситуаций, когда за одну запись постоянно боролись несколько конкурентых пользователей можно пересчитать по пальцам верхних конечностей. Обычно боролись переводом на серверные курсоры, либо рефрешем текущей записи при визуальной отрисовке датасета. Ну и разумеется защита от изменения уже измененной записи, реализовать ее можно ну например сравнением таймстампов записи на клиенте и сервере перед вызовом modiy и delete. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2010, 11:46 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
LSVЧто-то идея сохранения справочников локально пахнет началом 90-хх, DOS-ом и поделками "файл-сервер" некоторых фирмочек. Экономия на спичках, ИМХО. В эру промышленных СКЛ-СУБД это неактуально. Экономия составит 0,5% трафика. Применяем подобное только для шаблонов кристал-отчетов. Согласен... Но у автора есть определённые условия, которые не позволяют ему "перекроить" справочную систему. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2010, 12:40 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
LSVЧто-то идея сохранения справочников локально пахнет началом 90-хх, DOS-ом и поделками "файл-сервер" некоторых фирмочек. Экономия на спичках, ИМХО. В эру промышленных СКЛ-СУБД это неактуально. Экономия составит 0,5% трафика. Применяем подобное только для шаблонов кристал-отчетов. Можно смотреть на технологию локального сохранения с двух точек зрения: - это основная технология, которая обеспечивает программу справочной подсистемой - это опциональный кэш, который можно в любой момент отключить Я рассматриваю эту штуку, как дополнительный модуль кэширования. Ведь никто не говорит, что кэш в браузере - это пережитки 90-х в эру высокоскоростного интернета, он экономит трафик и даёт прирост производительности. Тут, собственно, то же самое. Система должна оставаться работоспособной и без него. Файлы кэша могут быть даже в каком-либо внутреннем формате (я выбрал бы дамп памяти MemDataseta), тут цель - производительность. Но, насколько я помню, автору немного не это нужно было. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2010, 12:50 |
|
Синхронизация данных
|
|||
---|---|---|---|
#18+
-=*ShamaN*=-, всё стои деньги. Кэш даже на HDD без обоснования в виде "счётчиков попадания" никому не нужен. Только делает систему глюкавее и дороже. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2010, 12:53 |
|
|
start [/forum/topic.php?all=1&fid=33&tid=1548305]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
79ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 191ms |
0 / 0 |