Sync Framework 2.0 + служба WCF - исключение OutofMemoryException - PullRequest
0 голосов
/ 20 мая 2011

У меня есть процесс, использующий Microsoft Sync Framework 2.0 через службу WCF (IIS Hosted) для синхронизации базы данных SQL 2008 Standard (сервер) и SQL CE 3.5 (клиент).Все работало отлично, пока один пользователь не начал получать исключения OutOfMemory.Как оказалось, у этого пользователя есть набор данных, который значительно больше, чем у любого другого пользователя.

Размер рассматриваемого набора данных составляет 800 000 строк, а общий размер при экспорте в CSV из SSMS составляет 174 МБ.Большинство пользователей находятся в диапазоне 20-30 МБ, что прекрасно работает.

Я использую DbServerSyncProvider и SqlCeClientSyncProvider.

Я реализовал пакетирование, как описано в других статьях, и опубликовал, но безрезультатно.,Насколько я понимаю, механизм пакетирования в DbServerSyncProvider - это просто количество ревизий данных, которые нужно извлечь за одно нажатие.Даже если якорная разница равна 1, я по-прежнему получаю набор данных того же размера.

Я использую TransferMode = "Streamed" в своем сервисе и применил исправление для Streamed при размещении в IIS.

Я попытался увеличить maxReceivedMessageSize, сначала с 20 МБ до 200 МБ, затем до 2 ГБ и, наконец, до 10 ГБ, но все безуспешно.Это было сделано как на сервере, так и на клиенте.

В моих журналах трассировки WCF показано выполнение GetChanges, но в журнале действий процесса ничего не регистрируется.

Я читал о SqlSyncProvider и о том, как онпозволяет дозировать по объему памяти.Я не могу найти много информации об использовании этого через Службу WCF, и прежде чем я попытаюсь переписать мой клиент и сервер, используя это, я хотел проверить, был ли я идиотом на чем-то и мог ли SqlSyncProvider решить мою проблемунаряду с возможностью передачи через службу WCF.

Заранее спасибо ...

1 Ответ

2 голосов
/ 20 мая 2011

Недостаточно памяти, скорее всего, вызвано тем, как наборы данных сериализуются.

Если вы хотите переписать, используя SqlSyncProvider, ознакомьтесь с разделом Код, специфичный для N-уровня по этой ссылке: http://msdn.microsoft.com/en-us/library/dd918908.aspx#Y3096. Это должно дать вам представление о написании компонента службы WCF для SqlSyncProvider.

Вы также можете проверить образец SQL Server и SQL Compact N-Tier с WCF

Если вы хотите сохранить существующих провайдеров, вы можете поиграть с помощью DatasetSurrogates. Ознакомьтесь с примером здесь: Sync Framework Синхронизация на основе WCF для автономного сценария - Использование настраиваемой сериализации набора данных

...