2012-03-05 72 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

相關問題