2017-12-03 4 views
-1

新しいデータを受け取ったときに数秒ごとにMySQLテーブルを更新するプログラムを作成しています。この関数には常に更新する無限ループがあり、その内部に別のループがあり、テーブル行を反復してそれに応じてデータを選択します。私は単に文seen in the example code hereと各反復の後(CONとドライバを除く)すべてのMySQL関連の値を削除しようとしましたC++コネクタを使用して無限ループでクリーンアップされないMySQLプリペアドステートメント

Can't create more than max_prepared_stmt_count statements

は残念ながら、関係なく、私は何をすべきか、私が最も哀れなエラーが発生しません。

私はただ、すべての値の前に場合に

stmt = NULL; 
stmt->close(); 

を追加しようとしました。

私はでプログラムを書き直そうとしましたが、回答は自動的にthis回答に基づいて自動的にクリーンアップされます。

私は、各繰り返しの後にMySQLサーバーへの接続を閉じて再確立しようと試みたこともありますが、それでも私には役立ちませんでした。

助けてください。

+0

私はそれを哀れなエラーと呼んでいません。あなたのメモリが使い果たされたり、サービス拒否攻撃を緩和したりする制限があります。あなたはいつでも制限を増やすことができますが、永続的なアプリケーションであっても16,382回の接続が多く見えます。 – Bradmage

+0

私はそれが哀れな感じを意味した – Roxerg

+1

ああ、はいエラーコードは勘違いすることができます! – Bradmage

答えて

1

ループに関する詳細情報が必要な場合があります。

しかし、stmt = con->createStatement();がループ内にあるようです。ループが始まる前に接続が1つだけ必要です。

その後、「デフォルト値は16382です。」mysql.comからdelete stmt;

res = stmt->executeQuery("SELECT 'Hello World!' AS _message");は、アプリケーションが、あなたはあなたのstmtを閉じる終了すると、あなたのループになステートメントを複数回実行することができますmysql.com-sysvar_max_prepared_stmt_countそれはあなたのように聞こえます。

+0

私は今これを試しています!私はそれがクラッシュするか、クラッシュするのを待っている間にもう1つの質問があります。ループの前に文を宣言してから、setInt/setString /などを使用します。それぞれのexecuteQuery()の前に、新しい値を取り込んでそれらを実行しますか? – Roxerg

+0

私は最終的にそれを実際にテストしますが、これは実際には機能し、パフォーマンスは10倍向上しました。ありがとう、私はちょうど壁に私の頭を叩いていた。 – Roxerg

+1

喜んでそれは働いて、時々あなたは問題を見るために誰かが外に必要です。私はC++を何年も使っていないので、具体的な記述はできませんが、mysqlはほとんど同じ言語で動作します。言い換えれば、あなたはループの外側でそれを準備し、それをループ内で実行することができなければなりません。つまり、それがどのように機能するのかということです。 – Bradmage

関連する問題