C++ 在使用Qt框架的多线程应用程序中减少DB连接的最佳策略

C++ 在使用Qt框架的多线程应用程序中减少DB连接的最佳策略,c++,mysql,multithreading,qt,C++,Mysql,Multithreading,Qt,我有一个服务器可以与许多设备通信(>1000)。每个连接都有自己的线程。现在,我意识到我必须将mysql配置设置为允许>1000个打开的并发连接,这在我看来是一个非常糟糕的主意 Qt文档说每个线程都需要自己的连接: 所以,我必须打电话 QSqlDatabase::addDatabase("QMYSQL", "thread specific string"); 在每一个线程中 这里的最佳实践是什么 我认为某种资源池在这里是合适的 根据>1000个设备线程的数据库工作负载,单个数据库线程可能会管

我有一个服务器可以与许多设备通信(>1000)。每个连接都有自己的线程。现在,我意识到我必须将mysql配置设置为允许>1000个打开的并发连接,这在我看来是一个非常糟糕的主意

Qt文档说每个线程都需要自己的连接:

所以,我必须打电话

 QSqlDatabase::addDatabase("QMYSQL", "thread specific string");
在每一个线程中


这里的最佳实践是什么

我认为某种资源池在这里是合适的

根据>1000个设备线程的数据库工作负载,单个数据库线程可能会管理它,或者您将需要多个数据库线程

然后设置一个从设备线程到数据库线程的排队系统,其中设备推送工作,数据库线程拉离工作单元并执行查询

我刚刚意识到,我只是想像某种日志记录一样写入数据库,如果您所做的是从数据库读取数据并写入设备,那么这种想法可能不需要修改就无法工作

  • 老实说,我对QT了解不多,但如果我把你的问题概括起来,我会建议你创建一个“连接池”
  • 如果您不想或无法实现连接池,那么可以在MySQL配置中增加Max_Connections并将池保留在MySQL上,因为它有自己的连接池机制

  • 谢谢你抽出时间。1.:使用qt连接池机制只允许在一个线程内有多个连接。所以,这在这里没有帮助。2.:最大连接数>1000?这真的是一个选项吗?还是创建/终止连接会让服务器崩溃?“有自己的连接池”指的是什么?请再详细说明一下,您是指像SQL Relay这样的额外服务,还是您所指的功能已经是mysql核心本身的一部分?据我所知,mysql具有嵌入式连接池,即您不需要另一个mysql实例,它将为您处理池。但请记住,连接池是在空闲连接上工作的,即,如果某个线程创建了某个连接,但该连接未被使用,那么其他线程可能会使用它。但在最坏的情况下,如果所有线程都在持续使用它们分配的连接,那么您可以使用最大MAX_连接。这听起来很有希望。现在,我只需要知道我必须在qt中做什么才能让mysql服务知道连接是空闲的:你认为
    QSqlDatabase::close()
    应该做这项工作吗?我想知道如果我在连接线程中接收到的每个数据包上打开/关闭DB连接是否会有问题。感谢您的意见。感谢@r_ahlskog和棉泽山法鲁奇两位提出的宝贵意见。我将这一个标记为解决方案,但是由于更多的实现时间,我没有尝试DB Manager线程。我所做的:我把连接处理留给了mysql服务(某种),因为我现在在代码中的几个点上关闭连接,然后在需要之前重新打开它。因此,对于每个线程,我仍然有一个连接对象,但我经常打开和关闭它们。CPU似乎不太在意。再次感谢!谢谢你抽出时间。池将是我最喜欢的解决方案,另一种是关闭和打开每个传入数据包上的DB连接(这并不能让我感觉很好)。使用DB Manager线程,您的想法很好。我的问题是连接和DB线程之间的通信。我只能想到qt信令概念,它将数据从连接线程发送到DB管理器线程。但这是基于事件的单向(或者几乎是:设置从DB管理器到动态创建的连接线程的连接也让我感觉很糟糕)