Sync Framework с базами данных SQL: начало работы

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

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

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

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

Пока что я думаю только синхронизировать каждого сотрудника, которому назначены нагрузки и связанные данные. В идеале мы должны сразу перейти к формату «Check In / Check Out», где они выбирают участников, которых планируют посетить, и затем синхронизируют необходимые данные.

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


person Refracted Paladin    schedule 09.08.2010    source источник
comment
Пожалуйста, дайте мне знать, если это требует более подробной информации, изменения формулировок или более точного определения. Для меня это очень важно.   -  person Refracted Paladin    schedule 10.08.2010
comment
Я очень благодарен всем, кто нашел время ответить. Я разочарован тем, что сам не сформулировал свой вопрос лучше, поскольку ответы на данный момент не полностью отражают мою озабоченность. Я отредактирую еще раз, чтобы попытаться помочь в этом.   -  person Refracted Paladin    schedule 17.08.2010
comment
Я полагаю, вы, вероятно, уже решили эту проблему, но если нет, я могу предложить несколько способов использования sync framework 2.0 или 2.1 вместе с sql 2005 или выше для решения этой проблемы. Я реализовал нечто подобное для иногда подключаемого приложения .NET 4 для 400 пользователей.   -  person stombeur    schedule 04.04.2011


Ответы (9)


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

Ознакомьтесь с этим пошаговым приложением, чтобы получить представление о том, что вы можете сделать.

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

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

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

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

person Roopesh Shenoy    schedule 19.08.2010
comment
Кстати, приведенный пример довольно подробен и показывает, как синхронизация работает только с двумя таблицами в трех разных базах данных (один сервер и два клиента). Вам придется обрабатывать сценарии клиентских вставок, создающих конфликты на первичных ключах - мы сделали это, имея совершенно разные последовательности для каждого из клиентов. - person Roopesh Shenoy; 19.08.2010
comment
Примечание. Возможно, вы не сможете давать людям напрямую, но вы сможете указать критерии фильтрации (местоположение? Учетная запись?) В шагах SP. - person Roopesh Shenoy; 19.08.2010

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

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

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

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

Отправка изменений, внесенных в офлайн-режиме

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

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

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

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

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

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

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

person Justin    schedule 16.08.2010

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

person Stumps    schedule 20.08.2010

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

person Chuck Haines    schedule 11.08.2010
comment
Спасибо, я это видел. Я просто надеялся на что-нибудь еще. Спасибо за ваше время. - person Refracted Paladin; 11.08.2010

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

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

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

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

ИЗМЕНИТЬ

Сам я не использовал Sync Framework, но вроде приятно. Дополнительную информацию можно найти в центре разработчиков Sync Framework.

person Tony Abrams    schedule 11.08.2010

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

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

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

person Beth    schedule 12.08.2010
comment
Спасибо за ответ. Мои пользователи будут подключены к сети большую часть времени в офисе, а затем возьмут ноутбуки в поле. Обычно они заранее знают, какие данные им понадобятся. Это должны быть постоянные данные, значит, локальная БД. У них не будет связи, пока они находятся в поле. - person Refracted Paladin; 13.08.2010
comment
Я удивлен, что им не нужны планшеты. Большинство людей, берущих ноутбуки в поле, считают их громоздкими. Опять же, я бы использовал какое-нибудь свободно доступное решение для синхронизации, даже если это, вероятно, будет означать, что вы синхронизируете больше данных, чем им на самом деле нужно в полевых условиях. Большинство решений для синхронизации относятся к уровням таблицы и поля, а не уровня строки. - person Beth; 13.08.2010

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

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

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

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

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

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

/KP

person Kosala Nuwan Perera    schedule 15.08.2010

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

Ваше здоровье

отметка

person Mark Evans    schedule 19.08.2010

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

person Community    schedule 19.08.2010