2012-03-05 10 views
2

私は多くのデバイス(> 1000)と通信するサーバーを持っています。各接続には独自のスレッドがあります。今、私は自分の意見では非常に悪い考えであると思われる> 1000の同時オープン接続を許可するようにmysql設定を設定しなければならないことに気付きました。Qtフレームワークを使用してマルチスレッドアプリケーションでDB接続を減らすためのベストプラクティス

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. 接続プールは、MySQL設定でMax_Connectionsを増やし、プールをMySQLに残すと、それ自体の接続プーリングメカニズムを持ちます。
+0

ありがとうございます。 1:qt接続プールメカニズムを使用すると、1つのスレッド内で複数の接続しかできなくなります。だから、これはここで役に立たないだろう。 2:max_connections> 1000?これは本当にオプションですか、接続の作成/削除はサーバを無意味にするでしょうか?あなたは "それ自身の接続プーリングを持っている"と引き合いに来ていますか?もう少し具体的に指定してください、SQL Relayのような追加のサービスを意味するのでしょうか、あるいはあなたが既にmysqlコア自体の一部を参照している機能ですか? – spikey

+0

私の知る限り、MySQLには接続プールが組み込まれています。つまり、MySQLの別のインスタンスは必要ありません。しかし、接続プーリングはアイドル接続で動作することを覚えておいてください。つまり、あるスレッドが接続を作成し、使用していない場合には、他のスレッドが使用する可能性があります。しかし、最悪の場合、すべてのスレッドが割り当てられた接続を使用し続けている場合は、最大MAX_CONNECTIONS接続を使用できます。 –

+0

これは有望ですね。さて、mysqlサービスに接続がアイドルであることを知らせるために、qtで何をしなければならないのかを知る必要があります。 'QSqlDatabase :: close()'がその仕事をするべきだと思いますか?接続スレッドで受け取った各データパケットのDB接続を開いたり閉じたりすると問題になるのだろうかと思います。ご意見ありがとうございました。 – spikey

1

ここでは、ある種のリソースプールが適切だと思います。

> 1000デバイススレッドのデータベースワークロードに応じて、1つのデータベーススレッドがそれを管理することも、複数のデータベーススレッドが必要になることもあります。

次に、デバイススレッドからデータベーススレッドへのキューイングシステムをセットアップします。ここで、デバイスは作業をプッシュし、データベーススレッドは作業ユニットをオフにしてクエリを実行します。

私は、何らかのロギングのようなものだけをデータベースに書くことを考えていることに気付きました。あなたがやっていることがデータベースからの読み取りとデバイスへの書き込みであれば、このアイデアは修正なしでは機能しないかもしれません。正直なところ、私はQTについて多くを知らないが、私は一般的に、あなたの問題を取る場合は、あなたが望んでいないか、実装することができない場合、私は、「接続プール」

  • を作成することを助言する話す

  • +0

    ありがとうございます。プーリングは、私が気に入っているソリューションです。もう1つは、着信データパケットごとにDB接続をクローズして開きます(本当に気に入らないもの)。あなたのアイデアはDB-Managerスレッドでうまくいきます。私の問題は、接続とDBスレッド間の通信です。私は、接続スレッドからDB-Managerスレッドにデータを送るというqtシグナリングの考え方しか考えていません。しかし、これはイベントベースの単方向性(またはほとんど:DB-Managerから動的に作成された接続スレッドへの接続を設定することで気分が悪くなります) – spikey

    関連する問題