【发布时间】:2009-04-10 04:36:28
【问题描述】:
我们正在开发一个 RetailPOS .net (windows) 应用程序。
一位客户问“突然断电时,应用程序中正在处理的当前数据会发生什么?”,“应用程序能否恢复未保存的数据?”
我想知道,如何将这个功能包含在 .net 应用程序中?
有人能帮帮我吗,为此需要做些什么?
【问题讨论】:
我们正在开发一个 RetailPOS .net (windows) 应用程序。
一位客户问“突然断电时,应用程序中正在处理的当前数据会发生什么?”,“应用程序能否恢复未保存的数据?”
我想知道,如何将这个功能包含在 .net 应用程序中?
有人能帮帮我吗,为此需要做些什么?
【问题讨论】:
首先,查看 UPS(不可中断电源)
其次,研究创建持久事务,这些事务将尽早且经常保存,但在您告诉它之前不会提交。这有点超出了 TSQL 中的典型事务。
【讨论】:
如果是硬断电(例如在笔记本电脑上拔下电池时拔掉电源),那么除了每次都写入磁盘之外,您无能为力。步。的。这。方式。 (谈谈对性能的影响。)还要确保您记录了一些内容,以便让应用程序知道它何时启动备份它之前正在执行的操作,以便它可以继续,或重试操作。
如果是断电,例如按下电源按钮以关闭/睡眠/休眠计算机,则侦听 SystemEvents.PowerModeChanged 事件并采取相应措施。
最后,请确保如果您的数据在半途写入数据库时会损坏,请确保您的数据库写入是原子的(所有更改都发生并被接受,或者都不接受)。
【讨论】:
您可以将当前接收到的信息附加到文件系统中。这将影响性能,但可以让您回到最后一个被捕获的项目。
当应用程序启动时检测是否有挂起的文件,并提供恢复选项。适当加载保存在文件中的数据。
一旦您掌握了所有信息,当您执行付款时发生的流程时,请确保以原子方式记录流程中的任何重大更改。如果您正在访问外部系统,请记录您启动操作的时间以及它立即返回的时间。在上述情况下,总有一个时间窗口可能会失败,但您希望将其保持尽可能短,并为恢复过程提供足够的信息。最坏的情况是如果系统无法自动恢复,您希望它有足够的信息来确定它在进程中停止的位置。
【讨论】:
您真正想要的是磁盘事务的原子性。有很多方法可以执行这些操作,但通常情况下,如果您使用现有的数据库产品,它会为您完成。
如果您推出了自己的数据库或文件格式,我们会根据您的文件格式为您完成一些工作。
【讨论】:
PowerFailureException 类将解决这个问题。实际上只是用UPS维持电源。唯一的其他选择实际上是维护数据库事务的原子性。
【讨论】:
您可能需要考虑让您的应用程序使用SQLite。
他们的when to use page 上有一些很棒的信息。
突出的几点是:
随着应用程序内容的修改,更新会自动发生
内容会持续自动更新,因此在发生电源故障或崩溃时不会丢失任何工作。
我正在为我将要实现的应用程序寻找类似的选项,该应用程序将在第三世界国家/地区使用,那里全天经常断电......到目前为止,SQLite 似乎作为一个突出的不错的选择。
但归根结底,您的选择将取决于您的个人情况和要求。
【讨论】: