一开始,我想为过度使用粗体文字道歉。我想简化对长期问题的理解。
我遇到了多次访问数据的问题。
我必须实现以下问题: 我有一个服务器应用程序 SERVER_A (基于TIdServer),有许多(大约100个)TCP连接。 每个连接的目标是:
这些状态(大约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
答案 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)而不是全文。这将降低您的网络和数据库负载与许多客户端。
如果您对项目有更多了解,我可以向您提供更多相关信息。