|
|
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
Собственно, хочу спросить: какие варианты реализации кто предложит, может сами что применяете... Абстрагируемся от средств разработки и конкретных СУБД. Задача тривиальная. Разрабатываемое приложение должно: - с заданной периодичностью подключаться к БД - запрашивать данные по определенному sql-запросу - выполнять некоторые "танцы с бубном" по полученным данными - отключаться "танцы с бубном" - не конкретизируем, ну к примеру поле А + поле Б - результат сохранить в файл на диск. Процесс требует оптимизации, то есть первая итерация обрабатывает все записи, последующие итерации - только те записи, которые изменились с предыдущей итерации. Самое интересное: Базу данных трогать нельзя! Т.е. нельзя добавлять служебные поля ("обработано/не обработано"), нет гарантии, что в выборке будет некое поле "дата изменений" и пр. Есть только следующие изветсные параметры: - текст sql-запроса - перечень ключевых полей, однозначно определяющих запись. Вопрос - какие варианты? Придется каким-то образом на клиенте кэшировать полученные данные, при следующем получении данных сравнивать и для изменившихся вызывать "танцы с бубном"... Как именно это лучше делать? --------- Когда все способы испробованы, а результата все нет, - прочтите наконец инструкцию! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 08:34:57 |
|
||
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
MustDie, В любом случае придется определять из пришедших данных те что уже были обработаны. А значит по любому будет цикл по данным запроса. Единственное что можно оптимизировать это способ хранения уже обработанных данных. Собственно способов ровно два: бинарное дерево или хэш-таблица. Хранение уже обработанных данных в простом отсортированном виде в динамическом массиве не подойдет потому-что добавление туда данных будет дорогим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 09:50:46 |
|
||
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
MustDie, а)Если можно, добавить в БД отдельную таблицу 1:1 (ключ, обработано) б)Хранить у себя список обработанных Задача похожа на Веб-апп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 09:52:08 |
|
||
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
Siemargl а)Если можно, добавить в БД отдельную таблицу 1:1 (ключ, обработано) Нельзя. Siemargl б)Хранить у себя список обработанных Это даже не обсуждается. Хранить придется по-любому. Но не только список обработанных, а все полученные данные, так как уже обработанные могут снова измениться в БД и их надо будет еще раз обрабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 10:59:36 |
|
||
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
shorewall Собственно способов ровно два: бинарное дерево или хэш-таблица. К этому я и склоняюсь. Затрудняюсь только с выбором хэш-функции. Нужна с максимальным быстродействием. Кроме того хочется общее хэш-занчение по всем полям записи, а не по каждому в отдельности. А каким образом для данной проблемы применимы бин.деревья? shorewall Хранение уже обработанных данных в простом отсортированном виде в динамическом массиве не подойдет потому-что добавление туда данных будет дорогим. Думаю использовать табличку на клиенте, может MemoryTable... Хранить все-равно придется соответсвия ключ/хэш-значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 11:07:06 |
|
||
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
MustDie, Насчет хэш-таблицы я слегка борщанул - надо использовать хэш набор(HasSet). Т.к. надо лишь опредилить был ли элемент обработан или нет, поэтому весь элемент сохранять не нужно, достаточно работать только с ключевыми полями. Собственно поскольку набор полей состовляющих клющ можно сравнивать друг с друго то их можно использовать при построении дерева. Дерево хороше тем что операция добавления элемента очень дешева. В хэш-наборе при его заполнении придется его переодически пересобирать(только если этот HashSet не построен поверх дерева), а поскольку в твоем случае количество обработанных данных будет непрерывно расти то и HashSet придется переодически пересобирать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 11:30:45 |
|
||
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
MustDie, а вот на ветках sql.ru по конкретным СУБД много раз обсуждалось, например, по MSSQLSERVER Журналирование изменений (названия разные) Там и ссылки на теоретические статьи по вопросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 11:34:38 |
|
||
|
Определение изменившихся записей со времени последнего запроса данных
|
|||
|---|---|---|---|
|
#18+
Если нет возможности читать время изменения записей в таблице и нельзя читать транзакционный лог, то ответ остается один-единственный: MustDieПридется каким-то образом на клиенте кэшировать полученные данные, при следующем получении данных сравнивать и для изменившихся вызывать "танцы с бубном"... Ставь на машину которая будет заниматься репликацией вторую базу данных, при каждом сеансе репликации она будет вытягивать к себе оригинальную базу целиком, сравнивать ее с сохранненой копией, разницу отправлять в базы-получатели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 17:59:20 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36501822&tid=1343844]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
195ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 548ms |

| 0 / 0 |
