gpt4 book ai didi

database - 改进对数据的多个同步访问

转载 作者:搜寻专家 更新时间:2023-10-30 22:14:33 25 4
gpt4 key购买 nike

一开始我想为过度使用粗体文本道歉。我想简化对我长问题的理解方式。

我在多次访问数据时遇到问题。

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

  • CLIENT 获取状态消息(每 2-5 秒)。状态包含 3双数存储为文本。
  • SERVER_ACLIENT 发送答案 - 在获得状态后

这些状态(大约 100 个)必须保存在 Firebird 数据库表中 - TABLE(我用 AnyDAC 来做)。每个 CLIENTTABLE 中都有其编号和记录。

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

LOCAL_APPLICATIONS 有时必须更改TABLE 的其中一项记录。作为响应,此更改必须通过 SERVER_A 的 TCP 连接传送到正确的CLIENT

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

到目前为止,每个 TCP 调用都将数据单独写入 TABLE,导致 Firebird 大量过载,并且 LOCAL_APPLICATIONS 执行的任何操作都非常缓慢。

因此我可以问:正确的方法是在 SERVER_A 中构建一个 LOCAL_ARRAY 并从所有 TCP 连接收集数据并定期将它们全部保存在一起TABLE 中的时间间隔(例如每 2 秒)?如果是这样,如何进行有效的数据同步:是时候更改 LOCAL_ARRAY 上的锁并在从中读取数据以将数据保存在 TABLE 中时锁定它?

也许更好的方法是为每个连接状态使用单个变量,然后使用 LOCAL_ARRAY 以避免在从一个CLIENT 插入数据时锁定 LOCAL_ARRAY 中的每个字段>?但它不是灵活的解决方案。

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

问候文章

最佳答案

看看 CQRS pattern .

CQRS stands for Command Query Responsibility Segregation. At its heart is a simple notion that you can use a different model to update information than the model you use to read information. This simple notion leads to some profound consequences for the design of information systems.

根据我的实验,这是在客户端-服务器架构中实现缩放和响应的非常好的模式。

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

这与您想要实现的非常接近。也许像这种 CQRS 模式这样的更高级的信息可能会对您有所帮助。

例如,在 CQRS 中,将多个命令连接到单个事务中的“一批”SQL 语句以提高速度是很常见的。一些数据库允许数组绑定(bind),这使得它更快。

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

关于database - 改进对数据的多个同步访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16262304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com