Sync Framework с базами данных SQL: начало работы
У меня есть приложение, которое использует 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
, Там нет никаких Sprocs
В настоящее время используется.
До сих пор я думал только о том, чтобы синхронизировать каждого рабочего, которому назначены нагрузки и связанные с ним данные. В идеале, мы должны перейти прямо к формату "Регистрация / выписка", где они выбирают членов, которых они планируют посетить, и затем они синхронизируют необходимые данные.
В качестве бонуса кто-то может сказать мне, что это называется? Я все время сталкиваюсь с "Иногда подключен", но это кажется неточным. Точнее было бы назвать их "Иногда DIS-Connected", мысли?
9 ответов
Мы использовали Sync Framework в нескольких наших проектах (один с сервером sql, другой с PGsql), поэтому я могу сказать, что он работает довольно хорошо.
Посмотрите это приложение, чтобы получить представление о том, что вы можете сделать.
http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=4835
Это покажет вам, как синхронизировать данные между несколькими базами данных SQL Server. Вы также можете настроить хранимые процедуры "приращения" для получения пользовательских параметров и фильтрации данных на основе этих параметров (например, людей, которых клиент-пользователь планирует посетить).
Я также предлагаю использовать отражатель для декомпиляции кода платформы Sync в случае, если вы видите странные ошибки - иногда невозможно определить, где находится ошибка, пока вы не увидите, что исключение попадет в код инфраструктуры. Redgate отлично работает для меня!
Дай мне знать, если тебе еще понадобится помощь!
http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=3422 Это хороший пример использования SQL Server CE, который отлично подойдет для того, что вы пытаетесь сделать, и занимает гораздо меньше места., Мне кажется, что функциональность, которую вы теряете, не мешает тому, что вы пытаетесь сделать в малейшей степени.
У меня есть пара предложений и советов, которые могут быть или не быть очевидными / полезными.
Для меня это звучит как проблема, которую можно разделить на 3 отдельных аспекта:
Процесс синхронизации
- Вы должны определенно убедиться, что все строки имеют своего рода столбец "last_update", чтобы ваш процесс синхронизации мог эффективно и надежно определить, какие данные уже обновлены - таким образом вы можете быть намного более агрессивными с количеством записей, которые вы синхронизируете
- Я бы избегал сложных процессов синхронизации и просто использовал бы метод грубой силы, где это возможно. Для меня 14 000 записей не так уж много - с оптимизацией вы можете обнаружить, что можно синхронизировать все изменения, сделанные между соединениями, в разумные сроки. Если нет, то я все равно, вероятно, буду весьма либерален в отношении того, что вы синхронизируете, чтобы пользователи не работали с устаревшими данными, не осознавая этого.
Подтверждение изменений, внесенных в автономном режиме
Если это вообще возможно, я бы, вероятно, просто запретил бы изменения в автономном режиме - это невозможно, тогда вы должны рассматривать изменение как отдельный (и, вероятно, довольно сложный) процесс сам по себе.
Не зная больше о приложении, трудно сделать хорошие предложения, поскольку процесс синхронизации очень зависит от бизнеса, однако некоторые вещи, которые следует учитывать:
- Должны ли пользователи иметь возможность блокировать (или извлекать) элемент, чтобы другие люди не могли изменить его, когда они работают в автономном режиме?
- Должен ли замок быть переопределенным?
- Если блокировка переопределена, что должно произойти, когда кто-то пытается сохранить изменения (процесс слияния кажется разумным выбором)
- Должен ли кто-то иметь возможность редактировать элемент, который он не проверил?
Если вы решите внедрить сложный процесс автономных изменений, вам может понадобиться взглянуть на рабочий процесс, используемый в общих распределенных VCS для вдохновения.
Изменение автономного хранилища данных
Вы можете найти использование SQL Compact или SQLite в качестве локального хранилища данных более элегантным решением (это, безусловно, облегчит процесс установки), если вы используете LINQ, то я бы, вероятно, предпочел SQL Compact, поскольку он определенно имеет LINQ to Поддержка SQL.
Сначала я бы остановился на двух вышеупомянутых, так как это изменение обеспечивает наименьшее количество улучшений для конечного пользователя и, вероятно, является самой большой работой - вышеупомянутые два полностью достижимы, при этом все еще используя SQL Server Express в качестве локального хранилища данных.
Вы уже пытались отфильтровать статьи репликации слиянием на уровне строк? Это уменьшит размер строки в 14 Кбайт до уровня управляемости.
После многих дней борьбы с платформой синхронизации я решил отказаться от нее и просто написать несколько простых служб и кода WCF. Мои требования довольно просты, односторонняя синхронизация от SQL2008 до SQL CE на мобильных устройствах. Исходя из моего опыта, его очень сложно настроить (синхронизировать только некоторые поля и т. Д.), И он чрезвычайно медленный и неэффективный. Я думаю, что Microsoft нужно проделать дополнительную работу, чтобы сделать ее немного проще в использовании.
ура
отметка
Вопрос в том, нужно ли вашему приложению работать на устройстве с локально сохраненными отключенными данными, или вы можете создать мобильную версию веб-интерфейса, поскольку предполагается, что при работе с данными ему всегда требуется подключение к серверу.?
В проектах, над которыми я работал (давным-давно), использовалась компактная структура и activesync с серверной частью Access или SQL Server, потому что было слишком дорого все время подключать каждое устройство, как телефон. Они взяли устройство в поле, им нужно было получить доступ к данным с отключенной БД, сделали свои моды и синхронизировали, когда вернулись в офис.
Если это то, что вы делаете, вы можете использовать их ID устройства, чтобы определить, какие случаи / строки нужны каждому устройству, но если вы думаете о разработке собственного решения для синхронизации, я думаю, что вы сражаетесь не в том направлении. Это уже сделано. Используйте проверенное решение для синхронизации, ограничения и все, и сфокусируйтесь на критериях, которые вы можете использовать для ограничения синхронизируемых данных.
Похоже, вам нужно больше контролировать параметры объединения данных. С этим требованием я вижу, что есть 2 типа данных; Данные, которые принадлежат участнику (дело принадлежит участнику), и общие данные (справка, основные данные).
В этом случае у меня была бы смесь этих техник, чтобы сделать вещи наполовину быстрыми.
Например, изменения основных и справочных данных не так часты. Поэтому нам не нужно синхронизировать очень часто, но нужно контролировать изменения и делать это нужно в центральном месте. В этом случае я бы внес изменения в свою центральную базу данных и использовал подход кувалдой.
Для транзакционных данных, предполагая однонаправленное, в этом случае член может изменять только те случаи / строки, которые ему принадлежат, могут быть реализованы многими способами.
Как упоминалось выше, вы можете использовать Sync Framework Developer Center или ActiveSync.
Поскольку пороговые значения не такие строгие, как в КПК или КПК, мы можем попробовать ручной подход, так как у нас есть Ноутбуки. Реализация подпрограммы функциональности / процесса для подключения и отправки данных, которые создаются, обновляются и удаляются (в этом случае мы должны поддерживать флаг на уровне базы данных) с использованием BulkCopy Operations - наиболее распространенный подход в этом сценарии (необходимо предоставить кнопку для членов, чтобы щелкнуть и вызвать, или сервис для опроса и проверки подключения и запуска процедуры синхронизации автоматически).
/ KP
Мне кажется, что Microsoft Sync может быть хорошим вариантом для вас. Обзор синхронизации баз данных здесь: http://msdn.microsoft.com/en-us/sync/bb887608.aspx. Посмотрите на это и посмотрите, соответствует ли оно вашим потребностям. Это звучит как идеальное решение вашей проблемы.
По сути это называется распределенными вычислениями.
В любой такой системе, над которой я работал, я обычно использовал N-уровневую архитектуру, чтобы иногда подключать клиентскую программу к серверу базы данных на сервере для операций CRUD. Любая работа, выполняемая клиентом, считается не требующей подключения, поскольку они не взаимодействуют с сервером, пока не сохранят свои изменения.
Используя такой подход, вы сможете создать приложение, которое позволит им на мгновение подключиться, чтобы получить некоторые данные, выполнить некоторую работу с данными и затем распространить любые изменения (CRUD) на сервер (базу данных).
Я должен сказать, что использование репликации слиянием с установками Local Sql Express наверняка является кувалдой. Не расстраивайтесь из-за этого, мы все время от времени делаем это:P.
РЕДАКТИРОВАТЬ
Я не использовал Sync Framework самостоятельно, но это кажется хорошим. Посетите Центр разработчиков Sync Framework для получения дополнительной информации.