改善对数据的多重同步访问

时间:2013-04-28 11:19:51

标签: database delphi synchronization indy anydac

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

我遇到了多次访问数据的问题。

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

  • 客户端获取状态消息(每2-5秒)。状态包含3 双数字存储为文本。
  • SERVER_A 的回答发送至客户 - 获取状态后

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

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

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

问题在于效率达到了这样的解决方案。

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

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

也许更好的是对每个连接状态使用sigle变量然后使用 LOCAL_ARRAY 来避免在从一个 CLIENT LOCAL_ARRAY 中的每个字段>?但这不是灵活的解决方案。

我的想法是否有效提高效率?或者不是吗?什么可以是更好的解决方案?

此致 ARTIK

2 个答案:

答案 0 :(得分:3)

查看CQRS pattern

  

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

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

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

这非常接近您要实施的内容。也许像CQRS模式这样的更高级别的信息可能对您有所帮助。

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

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

答案 1 :(得分:0)

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

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

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

修改

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

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

表名HotColdCool

ID   Description
1    HOT
2    COLD
3    COOL

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

如果您对项目有更多了解,我可以向您提供更多相关信息。