Как вы управляете своим приложением, когда база данных отключается? - PullRequest
6 голосов
/ 08 сентября 2008

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 08 сентября 2008

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

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

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

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

2 голосов
/ 08 сентября 2008

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

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

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

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

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

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

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

1 голос
/ 08 сентября 2008

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

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

1 голос
/ 08 сентября 2008

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

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

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

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

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

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

0 голосов
/ 08 сентября 2008

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

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

0 голосов
/ 08 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...