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

时间:2015-04-13 10:24:14

标签: c++ qt data-structures concurrency relational-database

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

问题是来自服务器的数据是高度关系数据。 在SQL术语中,它将是〜10-15个表,所有表都通过一些外键互连

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

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

我们现在面临的问题是该解决方案不能很好地扩展。应用程序的性能(点击屏幕延迟时发生的事情)变得更糟。

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

我希望我尽可能清楚地解决问题。

此致 安德烈


更清楚地说明:由于许多来自服务器的更新锁定了数据结构,因此GUI不再响应。

1 个答案:

答案 0 :(得分:3)

(根据更新的评论说明实际问题,UI线程块)

这里有两个简单的修复方法可以提供帮助。第一个问题是在锁定共享数据结构之前预处理所有传入数据。例如,如果您在地图中有std::string,则在地图上锁定时不要将const char*转换为std::string。这会在阻止UI线程的同时调用strlen。而是先转换然后锁定地图。

第二个改进是将GUI锁定一小段时间。如果可以将更新分区为多个较小的部分,请重复执行并释放锁定。这意味着实际更新速度较慢,但​​UI响应速度较快。

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