【发布时间】:2015-12-02 10:49:11
【问题描述】:
我目前正在尝试实现一个供个人使用的多线程数据库连接接口。这是使用 3 个类实现的
-
DatabaseManager数据库连接实例为每个连接实例化一个新线程 -
Database继承自 QThread 的对象,旨在在主线程中运行并公开接口以在工作对象上执行操作 -
DatabaseWorker在管理单个数据库连接的工作线程中运行事件循环的工作对象,等待查询并通过 Qt:QueuedConnections(信号/插槽)传递结果 - 当不再使用连接时(显式调用
close()方法),它的相关事件循环将停止并删除线程。这样做的目的是尽量减少线程的创建和删除。
到目前为止,这种架构在线程数量有限(通常少于 10 个连接)的情况下取得了很大的成功。我的主要问题是,如果我有 100 多个连接,这意味着一个应用程序有 100 多个线程,我不知道它会如何表现,这会带来我的主要问题
在应用程序中使用大量线程会适得其反吗?如果我同时打开 50/100/500/1000 个连接会发生什么?如果我这样做,I/O 数据库操作将需要很长时间才能完成(它最初并不是为此而设计的),但是有多少延迟是由线程数引起的?
【问题讨论】:
-
这取决于运行应用程序的硬件。如果您实际上可以在不同的内核上运行线程,那么只要调度程序不会阻塞每个单独的内核,您就会有所收获。这是线程作业真正独立的通常警告。这里没有明确的答案,只有剖析才能知道。
-
不知道 - 问问你的数据库:) 100,甚至 1000,线程本身并不是一个特殊的问题。您的数据库的特征可能是..
-
硬件是 Intel I5 2.4GHz,有 6 个硬件线程,打开很多数据库连接不是问题,因为我可以在不同的服务器上打开 100 个连接到 100 个不同的数据库。我现在只关心我的本地应用程序
-
是的...问题是,这取决于您的 rDB 接口。如果每个 DB 调用都被互斥锁完全锁定,那么无论您是 1 核还是 64 核都没有关系:(
-
使用每个连接线程的方法,一旦达到大约 800 个连接,如果您必须为大量连接中的每一个都做一点工作,您就会开始看到严重的性能问题。跨度>
标签: c++ multithreading performance qt qthread