Привет!
Есть база, живущая на разных серверах. До одних серверов можно быстро достучаться, до других нельзя.
База состоит из данных двух видов: реплицируемые (одинаковы на всех серверах) и нереплицируемые (на каждом сервере свои, например дата последнего обращения к строке).
Нужно построить отчет по этой базе. Для реплицируемых атрибутов он строится тривиально. Идем на любой сервер (ближайший) и берем с него то, что нам нужно. Для нереплицируемых атрибутов все чуть сложнее. Нам надо получать с каждого сервера его копию данных и смержить их по определенным правилам. Для даты последнего обращения правило простое: побеждает дата самого позднего обращения.
Реализовать это можно двумя путями:
1. Для каждого сервера делаем select recid, lastAccessTime from MyTable. Далее, для каждой записи обновляем текущую дату последнего обращения. В итоге за одну итерацию получаем данные с одного сервера и уточняем дату для всех записей.
2. Для каждой записи делаем select lastAccessTime from MyTable where recid='CurrentRecID'. Запрос выполняется на всех серверах. В итоге получаем за одну итерацию правильную дату для одной записи.
Очевидно, что способ 1 быстрее. Гораздо быстрее. С другой стороны, пока он не отработает до конца, мы не получим данные по всем записям.
Способ 2 тормозной. С другой стороны, пользователь может прервать операцию и работать с теми данными, которые мы успели получить. Причем это будут правильные данные.
Сейчас я сделал способ 1. Причем, при запросе реплицируемых данных я получаю и нереплицируемые тоже. Вывожу в отчет все. Потом в отдельном потоке их уточняю. Пока-что у пользователя нет возможности узнать, для каких записей данные уже полностью получены, для каких еще нет. Как это лучше сделать?
13.06.10 14:04: Перенесено модератором из 'Пользовательский интерфейс: проектирование, usability' — Кодт