Sync Framework с базами данных SQL: начало работы - PullRequest
17 голосов
/ 10 августа 2010

У меня есть приложение, которое использует SQL Enterprise для хранения всех данных в 4 разных БД. Мне нужно было встроить способность работать в автономном режиме для моих пользователей. Я сделал это через Merge Replication для локальной SQL Express установки для всех. Это «работает», но похоже на подход кувалдой.

Например, я реплицирую все 14000 человек на каждую БД, когда любой отдельный пользователь может НИКОГДА взаимодействовать со 100 или около того. Это даже не считая того факта, что они НИКОГДА не будут взаимодействовать с более чем 5 интервалами между соединениями с центральными БД.

Мне нужны советы, указатели и, возможно, хороший учебник по Sync Framework 2 (с базами данных). Из первых рук рассказывает о том, что сработало для вас и почему также будет приветствоваться. Я еще не наткнулся на четкий и краткий (не говоря уже о текущем) учебник по работе с Sync Framework.

Моя специфика MS SQL Server 2005 или 2008, любая версия. Любая .Net версия (3.5 или 4). Текущий уровень данных - все LinqToSQL. not any Sprocs используется в настоящее время.

До сих пор я думал только о том, чтобы синхронизировать каждого рабочего, которому назначены нагрузки и связанные с ним данные. В идеале, мы бы сразу пошли в формат «Регистрация / выписка», где они выбирают членов, которых они планируют посетить, и затем они синхронизируют необходимые данные.

В качестве бонуса кто-то может сказать мне, что это называется? Я все время сталкиваюсь с «Случайно подключенным», но это кажется неточным. Точнее было бы назвать их «Изредка DIS-Connected», мысли?

Ответы [ 9 ]

3 голосов
/ 19 августа 2010

Мы использовали Sync Framework в нескольких наших проектах (один с сервером sql, другой с PGsql), поэтому я могу сказать, что он работает довольно хорошо.

Проверьте это приложение, чтобы получить представление о том, что вы можете сделать.

http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=4835

Это покажет вам, как синхронизировать данные между несколькими базами данных SQL Server. Вы также можете настроить хранимые процедуры «приращения» для получения пользовательских параметров и фильтрации данных на основе этих параметров (например, людей, которых клиент-пользователь планирует посетить).

Я также предлагаю использовать отражатель для декомпиляции кода платформы Sync в случае, если вы видите странные ошибки - иногда невозможно определить, где находится ошибка, пока вы не увидите, что исключение попадет в код платформы. Redgate отлично работает для меня!

Дайте мне знать, если вам нужна дополнительная помощь!

1 голос
/ 20 августа 2010

http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=3422 Это хороший пример использования SQL Server CE, который отлично работает для того, что вы пытаетесь сделать, и занимает гораздо меньше места.Сдается мне, что функциональность, которую вы теряете, не мешает тому, что вы пытаетесь сделать в малейшей степени.

1 голос
/ 16 августа 2010

У меня есть пара предложений и советов, которые могут быть или не быть очевидными / полезными.

Для меня это звучит как проблема, которую можно разделить на 3 отдельных аспекта:

Процесс синхронизации

  • Вы обязательно должны убедиться, что все строки имеют своего рода столбец «last_update», чтобы ваш процесс синхронизации мог эффективно и надежно определить, какие данные уже обновлены - таким образом, вы можете быть намного более агрессивными с числом записей, которые вы синхронизируете.
  • Я бы избегал сложных процессов синхронизации и просто использовал бы метод грубой силы везде, где это было возможно. Для меня 14 000 записей не так уж много - с оптимизацией вы можете обнаружить, что можно синхронизировать все изменения, сделанные между соединениями, в разумные сроки. Если нет, то я, вероятно, все еще буду весьма либерален в отношении того, что вы синхронизируете, чтобы пользователи не работали с устаревшими данными, не осознавая этого.

Подтверждение изменений, внесенных в автономном режиме

Если это вообще возможно, я бы, вероятно, просто запретил бы изменения в автономном режиме - это невозможно, тогда вы должны рассматривать изменение как отдельное (и, вероятно, довольно сложный) процесс сам по себе.

Не зная больше о приложении, трудно сделать хорошие предложения, поскольку процесс синхронизации сильно зависит от бизнеса, однако следует учитывать следующие моменты:

  • Должны ли пользователи иметь возможность блокировать (или извлекать) элемент, чтобы другие люди не могли изменить его, когда они работают в автономном режиме?
  • Должен ли быть блокируемый замок?
  • Если блокировка переопределена, что должно произойти, если кто-то попытается сохранить изменения (процесс слияния кажется разумным выбором)
  • Должен ли кто-то иметь возможность редактировать элемент, который он не проверил?

Если вы решите внедрить сложный процесс автономных изменений, вам, возможно, захочется взглянуть на рабочий процесс, используемый в общих распределенных VCS для вдохновения.

Изменение автономного хранилища данных

Возможно, вы найдете использование SQL Compact или SQLite в качестве локального хранилища данных более элегантным решением (это, безусловно, облегчит процесс установки), если вы используете LINQ, тогда я Вероятно, я бы выбрал SQL Compact, поскольку он определенно поддерживает LINQ to SQL.

Сначала я бы остановился на двух вышеупомянутых, так как это изменение обеспечивает наименьшее количество улучшений для конечного пользователя и, вероятно, является наиболее эффективным - вышеупомянутые два полностью достижимы, все еще используя SQL Server Express в качестве локального хранилища данных.

0 голосов
/ 19 августа 2010

Вы уже пытались отфильтровать статьи репликации слиянием на уровне строк? Это уменьшит размер строки в 14 КБ до чего-то управляемого.

0 голосов
/ 19 августа 2010

После многих дней борьбы с платформой синхронизации я собираюсь отказаться от нее и написать несколько простых служб и кода WCF. Мои требования довольно просты, односторонняя синхронизация от SQL2008 до SQL CE на мобильных устройствах. Исходя из моего опыта, его очень сложно настроить (синхронизировать только некоторые поля и т. Д.), И он чрезвычайно медленный и неэффективный. Я думаю, что Microsoft нужно проделать дополнительную работу, чтобы сделать ее немного проще в использовании.

Приветствия

Mark

0 голосов
/ 15 августа 2010

Похоже, вам нужно больше контролировать параметры объединения данных. С этим требованием я вижу, что есть 2 типа данных; Данные, принадлежащие участнику (дело принадлежит участнику), и общие данные (справка, основные данные).

В этом случае у меня была бы смесь этих техник, чтобы сделать вещи наполовину быстрыми.

Например, изменения основных и справочных данных не так часты. Поэтому нам не нужно синхронизировать очень часто, но нужно контролировать изменения и делать это нужно в центральном месте. В этом случае я бы внес изменения в центральную базу данных и использовал подход кувалдой.

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

Как упоминалось выше, вы можете использовать Sync Framework Developer Center или ActiveSync.

Поскольку пороговые значения не такие строгие, как в КПК или КПК, мы можем попробовать и ручной подход, поскольку у нас есть Ноутбуки. Реализация подпрограммы функциональности / процесса для подключения и передачи данных, которые создаются, обновляются и удаляются (в этом случае мы должны поддерживать флаг на уровне базы данных) с использованием BulkCopy Operations, наиболее распространенного подхода в этом сценарии (необходимо предоставить кнопку чтобы пользователи могли щелкать и вызывать их, или сервис для опроса, проверки подключения и автоматического запуска процедуры синхронизации).

/ KP

0 голосов
/ 12 августа 2010

Вопрос в том, нужно ли вашему приложению работать на устройстве с локально сохраненными отключенными данными, или вы можете создать мобильную версию веб-интерфейса, поскольку предполагается, что при работе всегда требуется подключение к серверу с данными?

В проектах, над которыми я работал (давным-давно), использовались компактная платформа и activesync с серверной частью Access или SQL Server, потому что было слишком дорого постоянно подключать каждое устройство, как телефон. Они вывели устройство в поле, им нужно было получить доступ к данным с отключенной БД, сделали свои моды и синхронизировали, когда вернулись в офис.

Если это то, что вы делаете, вы можете использовать их ID устройства, чтобы определить, какие случаи / строки нужны каждому устройству, но если вы думаете о разработке собственного решения для синхронизации, я думаю, вы сражаетесь не в том направлении. Это уже сделано. Используйте проверенное решение для синхронизации, ограничения и все остальное и сосредоточьтесь на критериях, которые можно использовать для ограничения синхронизируемых данных.

0 голосов
/ 11 августа 2010

Мне кажется, что Microsoft Sync может быть хорошим вариантом для вас. Здесь приведен обзор синхронизации баз данных: http://msdn.microsoft.com/en-us/sync/bb887608.aspx. Посмотрите на него и посмотрите, соответствует ли он вашим потребностям. Это звучит как идеальное решение вашей проблемы.

0 голосов
/ 11 августа 2010

Это по сути называется Распределенные вычисления .

В любой такой системе, над которой я работал, я обычно использовал N-Tier Architecture для обеспечения возможности периодического подключения клиентской программы к серверу базы данных на серверной части для CRUD. операции. Любая работа, выполняемая клиентом, считается не связанной с подключением, поскольку они не взаимодействуют с сервером до тех пор, пока не сохранят свои изменения.

Используя такой подход, вы сможете создать приложение, которое позволит им на мгновение подключиться, чтобы получить некоторые данные, выполнить некоторую работу с данными и затем распространить любые изменения (CRUD) на сервер (базу данных).

Я бы сказал, что использование репликации Merge с установками Local Sql Express, безусловно, является кувалдой. Не расстраивайтесь из-за этого, мы все время от времени делаем это: P.

EDIT

Я сам не использовал Sync Framework, но, похоже, это хорошо. Обратитесь в Sync Framework Developer Center за дополнительной информацией об этом.

...