2012-03-05 37 views
2

我有一个服务器可以与很多设备(> 1000)进行通信。每个连接都有自己的线程。现在,我意识到我将不得不将我的mysql配置设置为允许> 1000开放并发连接,在我看来这似乎是一个非常糟糕的主意。在使用Qt框架的多线程应用程序中减少数据库连接的最佳策略

的Qt文档说,每一个线程需要它自己的连接:http://qt-project.org/doc/qt-4.8/threads-modules.html#threads-and-the-sql-module

所以,我要叫

QSqlDatabase::addDatabase("QMYSQL", "thread specific string"); 

在每一个线程。

这里的最佳做法是什么?

回答

0
  1. 老实说,我不知道很多关于QT但如果我把你的问题,一般的话,我会建议你创建一个“连接池”
  2. 如果你不想或者不能执行一个连接池可以很好地增加MySQL配置中的Max_Connections,并在MySQL上保留池,它具有自己的连接池机制。
+0

谢谢你的时间。 1 .:使用qt连接池机制将只允许在一个线程内部有多个连接。所以,这在这里没有帮助。 2 .: max_connections> 1000?这是一个真正的选择,还是创建/终止连接会使服务器瘫痪?你有什么想法“拥有自己的连接池”?请详细说明一下,你是指像SQL Relay这样的额外服务,还是你所指的功能已经是mysql核心本身的一部分? – spikey 2012-03-05 10:03:47

+0

获取我的知识MySQL具有嵌入式连接池,即您不需要MySQL的另一个实例,而是可以为您处理共享池。但请记住,连接池可用于空闲连接,即如果某个线程创建了某个连接并且未使用,则其他线程可能会使用该连接。但在最坏的情况下,如果所有线程都连续使用分配的连接,则可以使用最大MAX_CONNECTIONS连接。 – 2012-03-05 10:13:21

+0

这听起来很有希望。现在,我只需要知道我在qt中必须做什么才能让mysql服务知道连接处于空闲状态:您认为'QSqlDatabase :: close()'应该完成这项工作吗?我想知道,如果我在连接线程中接收到的每个数据包上打开/关闭数据库连接,是否会出现问题。感谢您的任何意见。 – spikey 2012-03-05 10:27:18

1

我认为某种资源池将适用于此。

根据来自> 1000个设备线程的数据库工作负载,单个数据库线程可能可以管理它,否则您将需要多个数据库线程。

然后从设备线程设置一个排队系统到数据库线程,设备推送工作,数据库线程关闭工作单元并执行查询。

我刚刚意识到我只是想写某种日志记录的数据库,如果您正在从数据库中读取数据并写入设备,此想法可能无法修改。

+0

谢谢你的时间。共享池将是我最喜欢的解决方案,另一个是关闭并打开每个传入数据包的数据库连接(这不会让我感觉真的很棒)。你的想法对于DB-Manager线程来说很好。我的问题是连接和数据库线程之间的通信。我只能想到qt信令概念将数据从连接线程发送到DB-Manager线程。但是,这是基于事件的单向(或几乎:设置从DB-Manager到动态创建的连接线程的连接,这让我感觉很糟糕。) – spikey 2012-03-05 10:18:13

相关问题