|
Синхронизация данных
|
|||
---|---|---|---|
#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?fid=33&gotonew=1&tid=1548305]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
8ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 187ms |
0 / 0 |