Database 改进对数据的多次同步访问

Database 改进对数据的多次同步访问,database,delphi,synchronization,indy,anydac,Database,Delphi,Synchronization,Indy,Anydac,首先,我要为过度使用粗体文本表示歉意。我想简化对我冗长问题的理解 我对数据的多重访问有问题 我必须解决以下问题: 我有一个服务器应用程序服务器a(基于TIdServer),具有许多(大约100个)TCP连接。 每个连接的目标是: 从客户端获取状态消息(每2-5秒一次)。状态包含3个 双数字存储为文本 获取状态后,从服务器A向客户端发送应答 这些状态(大约100个)必须保存在Firebird数据库表-表中(我用AnyDAC来做这个)。每个客户端在表中都有其编号和记录 另外三个本地网络客户端应用

首先,我要为过度使用粗体文本表示歉意。我想简化对我冗长问题的理解

我对数据的多重访问有问题

我必须解决以下问题: 我有一个服务器应用程序服务器a(基于TIdServer),具有许多(大约100个)TCP连接。 每个连接的目标是:

  • 客户端获取状态消息(每2-5秒一次)。状态包含3个 双数字存储为文本
  • 获取状态后,从服务器A向客户端发送应答
这些状态(大约100个)必须保存在Firebird数据库表-表中(我用AnyDAC来做这个)。每个客户端中都有其编号和记录

另外三个本地网络客户端应用程序-本地应用程序也必须访问。他们必须将表中的统计数据可视化

本地应用程序有时必须更改表的一条记录。结果作为响应,这些更改必须通过服务器A的TCP连接传递到右侧客户端

问题在于这种解决方案的效率是否达到

到目前为止,每个TCP调用都会将数据分别写入,导致Firebird大量过载,而本地应用程序执行的任何操作都非常缓慢

我是否可以问:正确的方法是在服务器a中构建本地_数组,并从所有TCP连接收集数据,并在表中以固定的时间间隔(例如每2秒)定期将所有连接保存在一起?如果是这样,如何进行有效的数据同步:是时候更改本地_数组上的锁了,并在从中读取数据时将其锁定,以将数据保存在表中

可能更好的方法是,对每个连接状态使用单变量,然后使用本地_数组,以避免在从一个客户端插入数据时锁定本地_数组中的每个字段?但这不是一个灵活的解决方案

我的想法是否有利于提高效率?或者更确切地说不是?有什么更好的解决方案

问候 阿蒂克

看一看

CQRS代表命令查询责任分离。其核心是一个简单的概念,即您可以使用不同的模型来更新信息,而不是使用不同的模型来读取信息。这个简单的概念会给信息系统的设计带来一些深远的影响

根据我的实验,这是在客户机-服务器体系结构中实现伸缩性和响应性的一个非常好的模式

您可以使用单独的数据库(如果可能的话,在内存中)进行查询,然后使用命令驱动的总线写入数据

这与您想要实现的非常接近。也许像这个CQRS模式这样的一些更高级的信息可以帮助您

例如,在CQR中,在单个事务中将多个命令合并到一个SQL语句“批处理”中以提高速度是很常见的。有些数据库允许数组绑定,这使得绑定速度更快


如果没有源代码,就很难找出问题所在。根据您显示的数字,我怀疑您必须找到应用程序的真正瓶颈。我想你实际上离火鸟的极限还很远,但正是你使用它的方式使它受到了限制。添加一些聪明的缓存,并使用清晰的CQRS模式可能会有很大帮助。

客户端:创建一个函数/过程,当用户执行操作时,该函数/过程将告诉服务器/表“im online”或“im offline”或类似的消息。而不是每2-5秒发送一次状态消息

服务器端:创建一个函数/过程,当来自任何客户机的新消息到达时,该函数/过程将只告诉客户机最新的更改(不充满表)

也可以在firebird中为此创建过程。这将降低您的网络和服务器流量/负载

编辑:

另一个想法是;您可以创建附加表来标识/列出标准数据。怎么样

假设您正在向客户端或从客户端发送或接收“热”、“冷”、“冷”数据。长文本意味着更多的网络和数据库负载。您可以创建一个表,该表列为所有内容的标准。让我们举个例子

表名HotColdCool

ID   Description
1    HOT
2    COLD
3    COOL
使用此表,您将只发送和接收ID(任何类型的int),而不是全文。这将降低许多客户端的网络和数据库负载


如果你对你的项目解释得更多,我可以给你更多的想法。

如果不看你的代码,这可能很难回答。你做过性能分析吗?你怎么知道需要改变什么?如果你还没有分析过,那么优化就是一个废话——大多数情况下,它最终会变成一些你认为不需要修复的东西。很多次我都看到算法在实现出错时受到指责……我没有做性能评测。我是业余爱好者,我不能做这个过程:(我写这个应用程序是为了帮助我的主要专业工作。我只是一个信息技术爱好者,我正在尝试自己去做。经过一年的出色工作,我不得不重新构建它。除了瓶颈之外,我还纠正了我代码中的一些其他部分。因此,我决定重新编写它-更好,我问如何做到这一点。)正确。谢谢你的回答。在你决定到底出了什么问题之前,为什么不先分析一下你的应用程序,找出真正的瓶颈在哪里。你为什么乐于猜测呢?你分析过了吗