当数据库脱机时,您如何管理您的应用程序?

How do you manage your app when the database goes offline?

提问人:mrpbody 提问时间:9/8/2008 更新时间:12/4/2015 访问量:959

问:

以 .Net Winforms 应用程序为例。混合一个不稳定的无线网络连接,与一些喜欢偶尔拔出蓝色插头的用户搅动,为了更好地衡量,添加一个系统管理员,决定不时地重新启动SQL Server盒子,而没有警告,只是为了让每个人都保持警惕。

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

  • 错误处理 - 例如,你是否包装了 使用 Try/Catch 调用服务器 或者你是否依赖某种形式的 要管理的一般错误处理 这?如果是这样,它是什么样子的?

  • 应用程序管理 - 例如,您是否 禁用应用程序并不允许用户 与它交互,直到 再次检测到连接?你会怎么做?

.NET SQL Server 错误处理

评论

0赞 mrpbody 10/30/2008
只是为了最终确定这一点 - 我们确实为那些离线工作的人使用 MS 同步服务。但是我们发现,在一个大型系统上同时在同步服务上运行 50+ 个用户,会导致 SQL Server 地狱,因为我们努力管理服务器上的冲突和负载。
0赞 mrpbody 10/30/2008
这就是为什么我们将标准的办公室绑定 pc 设置为直接访问 SQL Server,而不是通过中间数据库(如 SQL Compact)访问。感谢大家的回答 - 我真正想要的是当数据库不可用时人们在类似情况下会做什么的想法。

答:

0赞 Jon Limjap 9/8/2008 #1

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

1赞 Simon Keep 9/8/2008 #2

我们的方法中有这个,可以捕获所有未处理的异常......Main()

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

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

然后显示用户友好的消息。Application_UnhandledExceptionUnhandledExceptionCatcher

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

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

2赞 Roland Tepp 9/8/2008 #3

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

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

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

从那时起,您有多种选择可供您选择,具体取决于您需要提供的稳定性和可用性级别。

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

下一级保护将包括在本地缓存数据模型的部分,并在数据库连接关闭时,使用本地缓存查看和禁用任何需要显式数据库连接的功能。

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

1赞 Brad Leach 9/8/2008 #4

这可能对脱机方案的支持有点太多,但您是否考虑过“Microsoft 同步框架”?该框架中包括“Sync Services for ADO.NET 2.0”,它允许应用程序访问本地 SQL Server CE 实例。这可以通过各种方法轻松地与中央 SQL Server 同步。

这个框架处理永久的离线场景,正如我所说,它可能不适合你的特定要求,但它会给你的应用程序提供可靠的离线支持。

3赞 aku 9/8/2008 #5

答案取决于您的申请类型。有些应用程序可以脱机工作 - 例如Microsoft Outlook。此类应用程序不会将连接异常视为关键,它们可以在本地保存您的工作并在以后同步。其他应用程序(如在线游戏)会将通信问题视为严重异常,并在连接丢失时退出。

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

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

特别是针对你的方案,Microsoft 开发了断开连接的服务代理应用程序块

0赞 Giovanni Galbo 9/8/2008 #6

使用类似 SQLite 的东西离线存储数据,直到连接可用。

更新:我相信 SQLite 是 Google Gears 的后端,据我所知,它可以满足您在 Web 应用程序中的需求......虽然我不知道它是否可以在非网络环境中使用。