【问题标题】:It is advisable to keep a zTable always open?建议始终打开 zTable 吗?
【发布时间】:2014-10-01 20:02:00
【问题描述】:

我正在开发一个产品和收银员注册系统。

我的主要表单是筛选请求并从中打开其他注册屏幕(计量单位、产品、付款、客户等)

对于这些屏幕中的每一个,我在数据模块中都有一个 zTable。和每个窗体的 OnShow/OnClose,打开/关闭 zTables。

作为主屏幕,我需要这些打开的 zTable,我的问题是:建议我在主窗体中打开它们并在我的应用程序运行的整个过程中保持打开状态?

【问题讨论】:

  • 我不建议这样做。但其他人可能会。这让我想知道这是否真的基于意见。
  • 您使用的后端数据库是基于客户端-服务器(如 MS SQL Server)还是基于文件系统(如 Sqlite)?
  • @Sertac Akyuz:我想知道(关于意见),但是根据数据库后端的工作方式,存在客观差异。

标签: mysql delphi delphi-xe delphi-xe3


【解决方案1】:

基本上有两种类型的数据库系统可供 Delphi 应用程序访问,客户端-服务器 (C/S) 数据库系统和基于文件系统的数据库系统。我提到这一点的原因是,在决定是否可以在应用程序运行期间保持表打开状态时涉及到不同的技术考虑。因此,了解给定应用正在访问的类型非常重要。

这两种类型的主要区别在于哪个进程负责文件 i/o 并维护数据库、您的应用程序或单独的服务器进程(如 Sql Server/Interbase/Firebird/MySql)的完整性。

对于基于文件系统的数据库,您的应用程序负责执行文件 i/o(即使它是通过与 Sqlite 一样的 Dll),如果数据库访问涉及写入数据库,则有如果您的应用程序崩溃,或者用户通过 TaskMan 或 Ctl-Alt-Del 杀死它,例如,数据库的文件将被损坏或处于不一致的状态,则可能导致数据库无法使用。文件 i/o 需要内存中的结构,这些结构存在被诸如野指针等破坏的风险,如果在您的应用程序中发生这种情况,则数据的风险比由工业级服务器,打开的时间越长,风险就越大。

因此,与一般的文件访问一样,将文件保持打开的时间超过您真正需要的时间确实不是很好的做法。当您的应用程序关闭时,让它们打开以便稍后关闭真的是在自找麻烦。

如果您的数据库是基于服务器的,您可以采取更轻松的看法,因为服务器有责任确保按应有的方式处理文件更新,并且服务器倾向于在假设客户端完全正常的情况下进行编码可能只是“离开”而无需自行整理,并在比典型的客户端 Delphi 应用程序更安全的环境中运行。

不过,这不是一个借口,因为 Delphi 应用程序没有通过调用 ApplyUpdates(如果您的数据集类型支持它)或在客户端之后尽快执行您的数据集类型等操作来及时进行内部管理数据被更改,或者在关闭时没有自行整理(例如,通过关闭与服务器的连接,因为打开的连接往往会消耗服务器资源,即使连接没有被积极使用)。

除了您的应用程序崩溃的可能性之外,您向服务器发送用户认为他没有中继回服务器的更改的时间越长,其他用户更改数据的风险就越大与此人所做的不一致。

无论如何,尽管除了让表处于打开状态之外还有很多其他功能,无论您的数据库是基于服务器的还是基于文件的,但对“是否可取”的回答是不,不是,很少可以说它和严重的技术/实际因素反对它,尤其是基于文件的数据库。但是,与基于文件的数据库相比,在使用基于服务器的数据库时让表保持打开状态的危险性要低得多,只要您不做诸如等到应用程序关闭之前再写回任何更改的数据之类的事情到服务器。

即使使用基于文件的 dbs(实际上我会说“尤其是”),使用内存数据集(如 Delphi 的本机 TClientDataSet)作为用户通过 GUI 与之交互并离开它的 db 对象也有很多话要说到其他数据集组件,在短时间内工作,与数据库本身交互。

顺便说一句,这并没有什么区别,但我假设当您说“zTables”时,您指的是作为 Zeos 库组件的数据集。

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多