Akt*_*tau 5 c++ sql qt lazy-evaluation database-caching
我正在用C++/Qt编写一个项目,它能够连接到QtSQL支持的任何类型的SQL数据库(http://doc.qt.nokia.com/latest/qtsql.html).这包括本地服务器和外部服务器.
但是,当有问题的数据库是外部的时,查询的速度开始成为一个问题(慢UI,...).原因是:存储在数据库中的每个对象都是延迟加载的,因此每次需要属性时都会发出查询.平均大约20个这些对象将显示在屏幕上,每个对象显示约5个属性.这意味着对于我显示的每个屏幕,大约有100个查询被执行.查询在数据库服务器本身上执行得非常快,但是通过网络运行的实际查询的开销很大(整个屏幕以秒为单位).
我一直在考虑解决问题的几种方法,最重要的方法似乎是(据我所知):
例如,通过保持数据库的本地同步副本运行,可以使查询更快.但是,我在客户端计算机上运行的可能性并不大,例如与服务器上的数据库类型完全相同.因此,本地副本例如是SQLite数据库.这也意味着我无法使用特定于数据库供应商的解决方案.我有什么选择?什么在这种情况下对人们有效?
我主要担心的是:
什么是最小化查询成本的好方法?良好的意义某种组合:可维护,易于实现,而不是特定的aplication.如果它选择任何2,那么就这样吧.我想听听人们谈论他们的经历以及他们为解决这些问题所做的工作.
正如你所看到的,我已经想到了一些问题和处理它的方法,但是我不知道什么才是合理的方法.由于很可能涉及很多工作并且对程序中的许多层进行了密集的更改(希望尽可能少),我想在此之前向所有专家询问,然后再就此事做出最终决定.我也可以忽略一个非常简单的解决方案,在这种情况下,指向它的指针将非常感激!
假设所有相关的服务器端调优都已完成(例如:MySQL缓存,最佳索引,......)
*注意:我已经检查过类似问题但没有完全满足我的问题的用户的问题:对我的用例的复制方案的建议?和本地数据库缓存的最佳实践?例如)
如果需要任何其他信息来提供答案,请告诉我,我会及时更新我的问题.对于任何拼写/语法错误道歉,英语不是我的母语.
我的代码看起来像的一个小例子(当然简化):
QList<MyObject> myObjects = database->getObjects(20, 40); // fetch and construct object 20 to 40 from the db
// ...some time later
// screen filling time!
foreach (const MyObject& o, myObjects) {
o->getInt("status", 0); // == db request
o->getString("comment", "no comment!"); // == db request
// about 3 more of these
}
Run Code Online (Sandbox Code Playgroud)
乍一看,您似乎有两个相互冲突的目标:查询速度,但始终使用最新数据。因此,您可能应该回到您的需求来帮助做出决定。
1) 与应用程序的使用相比,您的数据库几乎是静态的。在这种情况下,请使用您的选项1b并预加载所有数据。如果数据在底层发生变化的可能性很小,只需为用户提供刷新缓存的选项(完全刷新或针对特定数据子集)。这样缓慢的访问就掌握在用户手中。
2) 数据库变化相当频繁。在这种情况下,“也许”SQL 数据库不适合您的需求。您可能需要一个性能更高的动态数据库来推送更新而不是拉取。这样,当基础数据发生变化时,您的应用程序就会收到通知,并且您能够快速响应。但是,如果这不起作用,您需要编写查询以最大程度地减少数据库库和 I/O 调用的数量。例如,如果您执行一系列select语句,您的结果应该按照您请求的顺序包含所有适当的数据。您只需跟踪相应的选择语句是什么。或者,如果您可以使用更宽松的查询条件,以便它为您的简单查询返回不止一行,这也应该有助于提高性能。
| 归档时间: |
|
| 查看次数: |
1759 次 |
| 最近记录: |