Как разделить процесс синхронизации в рамках синхронизации - PullRequest
0 голосов
/ 13 января 2010

Я использую каркас синхронизации для синхронизации базы данных sql server 2008 с sqlCE на мобильном устройстве. Все выглядит хорошо, кроме некоторых проблем. Один из них:
Если я хочу синхронизировать 1000 или более строк, я получаю исключение OutOfMemory на мобильном устройстве (хотя синхронизация завершается хорошо, потому что после этого я проверяю данные некоторых строк, и она выглядит синхронизированной). Я подумал, что, может быть, слишком большие xmls вращаются между мобильным устройством и сервером (для 100 строк evrth работает просто отлично) ... Вот почему я спросил о том, как разделить отправленные данные. Но, возможно, я не прав. Я не нашел никаких ресурсов по этому вопросу, поэтому я точно не знаю, ЧТО может потреблять столько памяти, чтобы добавить всего 60 КБ в компактную базу данных.

1 Ответ

1 голос
/ 26 января 2010

Вам нужно будет реализовать какую-то группировку.

Здесь показана довольно наивная версия: http://msdn.microsoft.com/en-us/library/bb902828.aspx.

Я видел, что вы заинтересованы в какой-то фильтрации. Если это отфильтрует некоторые или, вернее, много строк, я бы порекомендовал написать свою собственную пакетную логику. Тот, который мы используем в настоящее время, устанавливает @sync_new_received_anchor для привязки строки @sync_batch_size: th, которую нужно синхронизировать.

Очень упрощенно логика выглядит так:

SELECT @sync_new_received_anchor = MAX(ThisBatch.ChangeVersion) 
    FROM (SELECT TOP (@sync_batch_size) CT.SYS_CHANGE_VERSION AS ChangeVersion 
        FROM TabletoSync
             INNER JOIN CHANGETABLE(CHANGES [TabletoSync],
                                @sync_last_received_anchor) AS CT 
            ON TabletoSync. TabletoSyncID = CT. TabletoSyncID 
            WHERE TabletoSync.FilterColumn = @ToClient
            ORDER BY CT.SYS_CHANGE_VERSION ASC) AS ThisBatch
...