【问题标题】:How to prevent data loss in a .net application due to sudden power failure?如何防止 .net 应用程序因突然断电而丢失数据?
【发布时间】:2009-04-10 04:36:28
【问题描述】:

我们正在开发一个 RetailPOS .net (windows) 应用程序。

一位客户问“突然断电时,应用程序中正在处理的当前数据会发生什么?”,“应用程序能否恢复未保存的数据?”

我想知道,如何将这个功能包含在 .net 应用程序中?

有人能帮帮我吗,为此需要做些什么?

【问题讨论】:

    标签: .net winforms ups


    【解决方案1】:

    首先,查看 UPS(不可中断电源)

    其次,研究创建持久事务,这些事务将尽早且经常保存,但在您告诉它之前不会提交。这有点超出了 TSQL 中的典型事务。

    【讨论】:

      【解决方案2】:

      如果是硬断电(例如在笔记本电脑上拔下电池时拔掉电源),那么除了每次都写入磁盘之外,您无能为力。步。的。这。方式。 (谈谈对性能的影响。)还要确保您记录了一些内容,以便让应用程序知道它何时启动备份它之前正在执行的操作,以便它可以继续,或重试操作。

      如果是断电,例如按下电源按钮以关闭/睡眠/休眠计算机,则侦听 SystemEvents.PowerModeChanged 事件并采取相应措施。

      最后,请确保如果您的数据在半途写入数据库时​​会损坏,请确保您的数据库写入是原子的(所有更改都发生并被接受,或者都不接受)。

      【讨论】:

        【解决方案3】:

        您可以将当前接收到的信息附加到文件系统中。这将影响性能,但可以让您回到最后一个被捕获的项目。

        当应用程序启动时检测是否有挂起的文件,并提供恢复选项。适当加载保存在文件中的数据。

        一旦您掌握了所有信息,当您执行付款时发生的流程时,请确保以原子方式记录流程中的任何重大更改。如果您正在访问外部系统,请记录您启动操作的时间以及它立即返回的时间。在上述情况下,总有一个时间窗口可能会失败,但您希望将其保持尽可能短,并为恢复过程提供足够的信息。最坏的情况是如果系统无法自动恢复,您希望它有足够的信息来确定它在进程中停止的位置。

        【讨论】:

          【解决方案4】:

          您真正想要的是磁盘事务的原子性。有很多方法可以执行这些操作,但通常情况下,如果您使用现有的数据库产品,它会为您完成。

          如果您推出了自己的数据库或文件格式,我们会根据您的文件格式为您完成一些工作。

          【讨论】:

            【解决方案5】:

            PowerFailureException 类将解决这个问题。实际上只是用UPS维持电源。唯一的其他选择实际上是维护数据库事务的原子性。

            【讨论】:

              【解决方案6】:

              您可能需要考虑让您的应用程序使用SQLite

              他们的when to use page 上有一些很棒的信息。

              突出的几点是:

              • 随着应用程序内容的修改,更新会自动发生

              • 内容会持续自动更新,因此在发生电源故障或崩溃时不会丢失任何工作。

              我正在为我将要实现的应用程序寻找类似的选项,该应用程序将在第三世界国家/地区使用,那里全天经常断电......到目前为止,SQLite 似乎作为一个突出的不错的选择。

              但归根结底,您的选择将取决于您的个人情况和要求。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-04-20
                • 1970-01-01
                • 2022-01-23
                • 1970-01-01
                • 1970-01-01
                • 2016-06-29
                • 1970-01-01
                相关资源
                最近更新 更多