关系应用程序数据的并发更新

Concurrent updates of relational application data

本文关键字:并发 更新 数据 应用程序 关系      更新时间:2023-10-16

我们有一个Qt C++Gui应用程序,它基本上是一个终端到服务器(TCP)软件,控制它并显示它的数据。

问题是来自服务器的数据是高度相关的数据。在SQL术语中,大约10-15个表都通过一些外键互连

这些数据由服务器更新,并且必须(同时)由GUI显示。

目前的解决方案是,我们将所有数据存储在(基本上)具有适当锁定(读/写)的映射和结构中,以避免并发访问的问题。

我们现在面临的问题是,这种解决方案的规模不是很好。应用程序的性能(点击屏幕上发生的事情延迟)变得更差。

使用应用程序中的关系数据库系统(比如带有内存中数据库的sqlite)会有帮助吗?使用数据库(在查询时解决关系依赖关系)是否比使用结构映射(在插入时解决关系依存关系)更好地扩展?

我希望我把我的问题说得尽可能清楚。

谨致问候,Andre


更清楚地说:这是关于GUI不再响应,因为服务器的许多更新锁定了数据结构。

(基于说明实际问题的更新注释,UI线程块)

这里有两个简单的修复程序可以提供帮助。第一个问题是在锁定共享数据结构之前对所有传入数据进行预处理。例如,如果映射中有std::string,请不要在锁定映射的同时将const char*转换为std::string。这将在保持UI线程的同时调用strlen。相反,请先转换,然后锁定贴图。

第二个改进是锁定GUI的时间更短。如果更新可以划分为多个较小的部分,请重复获取和释放锁定。这意味着实际的更新速度较慢,但UI的响应能力更强。

一个更复杂的策略(如果分区不可能的话)是分段。在新映射中创建所有新条目,然后合并这两个映射。这基本上是类固醇的预处理,因为你现在也排序新的条目。(我希望你正在与服务器交换diff,而不是每次都对数据进行完全刷新!)