建议始终打开zTable吗?

时间:2014-08-08 10:51:50

标签: mysql delphi delphi-xe delphi-xe3

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

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

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

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

1 个答案:

答案 0 :(得分:3)

Delphi应用程序可以访问的基本上有两种类型的数据库系统,客户端服务器(C / S)和基于文件系统的数据库系统。我提到的原因是,在确定应用程序持续时间内是否可以打开表格时,需要考虑不同的技术因素。因此,了解给定应用正在访问的类型非常重要。

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

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

因此,与一般的文件访问一样,将文件保持打开的时间实际上并不是很好的做法,而不是真正需要它们。当你的应用程序关闭时,让它们打开以关闭是真正的麻烦。

如果您的数据库是基于服务器的,您可以采取更放松的视图,因为服务器有责任确保文件更新按原样处理,并且服务器往往会被编码假设客户很可能只是“离开”#34;没有整理自己,并在比典型的客户端Delphi应用程序更安全的环境中运行。

但是,这并不是一个借口,因为Delphi应用程序不会通过调用ApplyUpdates(如果您的数据集类型支持它)或者数据集类型的等效类型,尽快完成其内务管理。当客户端数据关闭时(例如,通过关闭与服务器的连接,因为即使连接未被主动使用,开放连接也会消耗服务器资源),客户端数据会被更改,或者不会自行整理。

除了您的应用程序崩溃的可能性之外,您发送服务器的时间越长,用户认为他没有将其转发回服务器,其他用户以某种方式更改数据的风险就越大与这个人所做的事情不一致。

无论如何,虽然除了让桌子保持打开状态之外还有很多其他内容,无论你的数据库是基于服务器还是基于文件,你的答案都是可取的#34;不是没有,对它的说法很少,以及严重的技术/实际因素,尤其是基于文件的dbs。但是,在使用基于服务器的数据库时保持打开表比使用基于文件的数据库更容易发生危险,只要您不等待应用程序关闭之前等待写任何更改数据回到服务器。

即使使用基于文件的dbs(实际上我会说"特别是"),使用像Delphi的本机TClientDataSet这样的内存数据集作为db对象有很多话要说用户通过GUI进行交互,并将其留在其他数据集组件中,以短暂的突发方式工作,与数据库本身进行交互。

顺便说一句,并不是说它有任何区别,但我假设当你说" zTables"时,你的意思是作为Zeos库组件的数据集。)