Mysql 保持zTable始终打开是明智的吗?

Mysql 保持zTable始终打开是明智的吗?,mysql,delphi,delphi-xe,delphi-xe3,Mysql,Delphi,Delphi Xe,Delphi Xe3,我正在开发一个产品和收银员注册系统 我的主要表单是筛选请求,并从中打开其他注册屏幕(计量单位、产品、付款、客户等) 对于每个屏幕,我在数据模块中都有一个zTable。在显示/关闭每个表单时,打开/关闭zTables 作为主屏幕,我需要这些打开的zTables,我的问题是:建议我以主窗体打开它们,并在应用程序运行的整个过程中保持它们的打开状态?Delphi应用程序基本上可以访问两种类型的数据库系统,客户端-服务器(C/s)和基于文件系统的数据库系统。我提到这一点的原因是,在决定是否可以在应用程序期

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

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

对于每个屏幕,我在数据模块中都有一个zTable。在显示/关闭每个表单时,打开/关闭zTables


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

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

这两种类型之间的关键区别在于哪个进程负责文件i/o和维护数据库、应用程序或单独的服务器进程(如Sql server/Interbase/Firebird/MySql)的完整性

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

因此,与一般的文件访问一样,让文件打开的时间超过实际需要的时间并不是很好的做法。当你的应用程序关闭时,只是让它们打开然后再关闭,这真的是自找麻烦

如果数据库是基于服务器的,您可以采取更宽松的观点,因为服务器有责任确保文件更新得到应有的处理,而服务器的编码往往是基于这样的假设,即客户端很可能只是“离开”,而不会自行清理,并在比典型的客户端Delphi应用程序更安全的环境中运行

不过,这并不是Delphi应用程序不及时进行内务管理的借口,比如在客户端数据更改后尽快调用ApplyUpdate(如果您的数据集类型支持),或者为您的数据集类型调用等效数据集,或者在关闭后不进行整理(例如,通过关闭与服务器的连接,因为即使连接未被积极使用,打开的连接也会消耗服务器资源)

除了你的应用程序崩溃的可能性之外,你离开发送服务器的时间越长,用户认为他所做的更改没有转发回服务器,另一个用户以与此用户所做的不一致的方式更改数据的风险就越大

无论如何,尽管这不仅仅是让表保持打开状态,不管您的数据库是基于服务器还是基于文件的,但对于您的“建议这样做吗?”是的,不是的,没有什么可说的,还有严重的技术/实践因素反对它,特别是对于基于文件的数据库。但是,在使用基于服务器的数据库时,让表保持打开状态比使用基于文件的数据库要容易得多,只要你不做一些事情,比如等到应用程序关闭之前才写任何代码将数据重新发送到服务器

即使使用基于文件的dbs(实际上我会说“尤其是使用”),也有很多话要说,使用内存中的数据集,如Delphi的原生TClientDataSet,作为用户通过GUI与之交互的db对象,并将其留给其他数据集组件,以短时间的突发方式与db本身交互


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

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