1

一开始我要为过度使用粗体字表示歉意。我想简化对我长问题的理解方式。

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

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

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

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

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

LOCAL_APPLICATIONS有时必须更改TABLE的记录之一。结果,必须通过SERVER_A的TCP 连接将这些更改传递给正确的CLIENT作为响应。

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

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

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

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

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

问候阿蒂克

4

2 回答 2

3

看看CQRS 模式

CQRS 代表Command Query Responsibility Segregation。它的核心是一个简单的概念,即您可以使用与用于读取信息的模型不同的模型来更新信息。这个简单的概念对信息系统的设计产生了一些深远的影响。

从我的实验来看,这是在客户端-服务器架构中实现扩展和响应能力的一个非常好的模式。

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

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

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

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

于 2013-04-28T12:35:28.790 回答
0

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

服务器端:创建一个函数/过程,当新消息从任何客户端到达时,它将告诉客户端仅最新的更改(未满表)。

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

编辑:

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

假设您正在向客户或从客户发送或接收“HOT”、“COLD”、“COOL”数据。长文本意味着更多的网络和数据库负载。您可以创建一个表,列出所有事物的标准。让我们做一个例子;

表名 HotColdCool

ID   Description
1    HOT
2    COLD
3    COOL

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

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

于 2013-04-29T13:36:11.613 回答