数据库离线时如何管理应用程序?

时间:2020-03-05 18:49:15  来源:igfitidea点击:

将.Net Winforms App ..混入一个简单的无线网络连接中,与一些只想偶尔偶尔拔出蓝色插头的用户搅动一下,并采取适当的措施,添加一个Systems Admin,它决定在不警告的情况下重新启动SQL Server盒。一次又一次地只是为了让每个人都保持警惕。

关于以下方面处理此类情况的建议和策略是什么:

  • 错误处理-例如,我们是否使用"尝试/捕获"包装对服务器的每个调用,还是依靠某种形式的通用错误处理来管理此错误?如果是这样,它是什么样的?
  • 应用程序管理-例如,我们是否禁用了该应用程序并且不允许用户与它进行交互,直到再次检测到连接?你会怎么做?

解决方案

回答

在我们的应用程序中,我们为用户提供了连接到另一台服务器的选项,例如,如果数据库连接失败,则会显示一个对话框,指出该服务器不可用,他们可以输入另一个IP地址进行尝试。

回答

我们的Main()方法中包含了所有未处理的异常...

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

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

然后," Application_UnhandledException"和" UnhandledExceptionCatcher"显示用户友好的消息。

此外,应用程序然后将数据(例如堆栈跟踪)通过电子邮件发送给开发人员,这可能非常有用。

当然,这取决于应用程序,但是对于我们描述的那种故障,我会关闭应用程序。

回答

我已经多年没有接触WinForms和.NET了,所以我不能给我们任何技术细节,但是有一个更大的图片答案:

首先,最重要的是不要将表单数据直接绑定到数据库。

创建一个单独的数据/模型层,将表单小部件绑定到该层。

从那里开始,根据需要提供的稳定性和可用性级别,我们可以使用几个选项。

这里最简单的解决方案之一可能就是仅基于连接状态启用/禁用需要与数据库交互的应用程序部分。

更高级别的保护包括在数据库连接断开时在本地缓存数据模型的一部分,使用本地缓存查看和禁用任何需要显式数据库连接的功能。

可能最棘手的事情(可能还会为最终用户提供最稳定的体验)是在本地复制数据库,并使用某种同步模式来使数据库副本与远程db保持同步。

回答

这可能对脱机方案有太多支持,但是我们是否考虑过" Microsoft Sync Framework"?该框架中包含"用于ADO.NET 2.0的同步服务",它使应用程序可以访问本地SQL Server CE实例。可以通过多种方法轻松地将其与中央SQL Server同步。

该框架处理永久性脱机情况,正如我所说,它可能不适合特定要求,但是它将为应用程序提供可靠的脱机支持。

回答

答案取决于应用程序类型。例如,有些应用程序可以脱机运行Microsoft Outlook。此类应用程序并不将连接异常视为关键,它们可以将工作保存在本地并在以后进行同步。诸如在线游戏之类的其他应用程序会将通信问题视为关键异常,如果连接丢失,则将退出。

至于错误处理,我认为我们应该在所有层上控制异常,而不是依靠一些常规的异常处理代码。业​​务层应该了解下层(在我们的案例中是数据访问层)发生了什么,并做出相应的响应。我认为连接丢失不应被视为意外异常。对于异常管理的良好实践,我建议我们看一下"异常处理应用程序块"。

关于应用程序行为,我们应该回答以下问题:"我的应用程序对于处于断开状态的客户是否具有商业价值?"在许多情况下,最终用户能够在断开状态下继续其工作将是有益的。然而,这种行为极其难以实施。

Microsoft特别针对情况开发了Disconnected Service Agent应用程序块

回答

使用类似SQLite的方法脱机存储数据,直到可用连接为止。

更新:我相信SQLite是Google Gears的后端,据我了解,它可以满足我们在Web应用程序中的需求……尽管我不知道它是否可以在非Web上下文中使用。