Как вы управляете своим приложением, когда база данных переходит в автономный режим?

StackOverflow https://stackoverflow.com/questions/49426

  •  09-06-2019
  •  | 
  •  

Вопрос

Возьмите .Приложение Net Winforms..добавьте ненадежное беспроводное сетевое соединение, перемешайте с несколькими пользователями, которым нравится время от времени просто вынимать синий штекер, и для пущей убедительности добавьте системного администратора, который время от времени решает перезагружать SQL server без предупреждения, просто чтобы держать всех в напряжении.

Каковы предложения и стратегии для работы с такого рода сценариями в отношении :

  • Обработка ошибок - например, вы завершаете каждый вызов к серверу с помощью Try / Catch или вы полагаетесь на какую-либо форму Общей обработки ошибок для управления этим?Если да, то на что это похоже?

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

Это было полезно?

Решение

Ответ зависит от типа вашего приложения.Существуют приложения, которые могут работать в автономном режиме - например, Microsoft Outlook.Такие приложения не рассматривают исключения подключения как критические, они могут сохранять вашу работу локально и синхронизировать ее позже.Другие приложения, такие как онлайн-игры, будут рассматривать проблему со связью как критическое исключение и завершат работу, если соединение будет потеряно.

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

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

Специально для вашего сценария Microsoft разработала Отключенный Блок приложения Service Agent

Другие советы

Я уже много лет не прикасался к WinForms и .NET, поэтому не могу сообщить вам никаких технических подробностей, но есть ответ на lager picture:

Первое и самое главное - не привязывайте данные вашей формы напрямую к базе данных.

Создайте отдельный слой данных / модели, к которому вы привязываете свои виджеты форм.

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

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

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

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

Это может быть немного слишком большая поддержка автономного сценария, но рассматривали ли вы "Платформа синхронизации Microsoft"?В состав платформы входят "Службы синхронизации для ADO.NET 2.0", которые позволяют вашему приложению обращаться к локальному экземпляру SQL Server CE.Это может быть легко синхронизировано с центральным SQL-сервером с помощью различных методов.

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

У нас есть это в нашем Main() метод, который улавливает все необработанные исключения...

Application.ThreadException += new 
System.Threading.ThreadExceptionEventHandler(UnhandledExceptionCatcher);

Thread.GetDomain().UnhandledException += new 
UnhandledExceptionEventHandler(Application_UnhandledException);

а потом Application_UnhandledException и UnhandledExceptionCatcher отображайте удобные для пользователя сообщения.

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

Конечно, это зависит от приложения, но при тех сбоях, которые вы описываете, я бы закрыл приложение.

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

Используйте что-то вроде SQLite - файл хранить данные в автономном режиме до тех пор, пока не будет установлено соединение.

Обновить:Я считаю, что SQLite - это серверная часть для Механизмы Google, который, насколько я понимаю, делает то, что вы ищете в веб-приложениях...хотя я не знаю, можно ли его использовать не в веб-контексте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top