4

MySQL には、最大接続数max_user_connectionsを強制する機能があります。

PHP(および他の言語)から接続する場合、その数を超えると、接続の最大数を超えたことを示すエラーで接続が失敗することを理解しています。正しい?

私の好みは、代わりに、接続が利用可能になるまで(タイムアウト制限まで)接続呼び出しを待機させることです。ただし、MySQL のドキュメントを読んだり Web を検索したりしても、これを行う方法を特定できませんでした。

私の懸念は、Web アプリへのトラフィックが殺到し、多数の同時 MySQL 接続試行が発生した場合、一部のユーザー スクリプトがエラーで終了することです。当然のことながら、特定の回数まで再接続を試行するように呼び出しコードを変更することもできますが、すべての「接続」呼び出しをラップするのではなく、これを処理するように接続試行自体を変更できれば、はるかにクリーンになります。ループ。さらに、ループは実際の FIFO キューにはなりません。これは、個々の呼び出しスレッドが少しの間待機してから再試行し、接続が得られるかどうかが、その特定の瞬間に接続が利用可能かどうかに依存するためです。その後、再び待機し、待機中に接続が開き、「さらに戻って」別のスレッドがそれを取得する可能性があります。

では、PHP API のいずれかを使用して MySQL に接続する場合、「接続が利用可能になるまで待機する」方法で接続を試行する方法はありますか?

4

2 に答える 2

2

MySQLには、あなたが説明していることを行う機能はありません。つまり、MySQL には、ヒットしたときに接続の FIFO (キュー) がありませんmax_connections。すぐに接続できない場合、すべての接続でエラーが発生します。

MySQL に組み込まれている最も関連性の高いものは構成変数back_logで、未処理の接続数の制限のみを構成します。つまり、メインの MySQL スレッドは着信接続をチェックするのに少し時間がかかり、これらはソケットが完了する前であり、MySQL が複数のmax_connectionsスレッドがあるかどうかを判断する前にリッスン キューに積み上げられます。max_connections実際、サーバーが現在スレッド数をはるかに下回っていても、リッスン キューに多数の未処理の接続が存在する可能性があります。

http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_back_log

別のオプションは、HA-Proxy がキュー機能を提供ているため、HA-Proxy をミックスに追加することです。これについて詳しく説明しているブログは次のとおりです: http://flavio.tordini.org/a-more-stable-mysql-with-haproxy

率直に言って、ほとんどのサイトmax_connectionsはトラフィックの典型的なスパイクを処理できるようになるまで増加し、そこからデータベース アクティビティを最適化しようとするため、接続時間が短くなり、スループットが向上します。また、できるだけ遅く接続し、すべてのクエリが完了したらできるだけ早く切断するようにアプリケーションをコーディングすることも役立ちます。

を超える異常なトラフィックの急増がある場合max_connections、アプリケーションはそれを示すエラーを受け取ります。このようなエラーを適切に処理するようにアプリをコーディングする必要があります。つまり、「申し訳ありませんが、負荷が大きすぎて現在リクエストを処理できません。しばらくしてからもう一度お試しください。」のようなメッセージをできる限り適切に表示します。これは、突然の白い画面やスタック トレースなどよりも少なくとも優れています。

于 2014-05-09T06:44:51.733 に答える
-2

フッターのすべてのphpページに以下のphpコードを追加してみてください:

  mysql_close();

通常、エラーメッセージはmysql接続を閉じずにサーバー側で接続を保持することです。しかし、それはずっと前の私の愚かなコーディング エラーです。mysql接続を閉じても問題を解決できません。サーバーにログインしてphp.iniの設定を変更し、接続ユーザーの値を増やす必要があると思います。私の答えが問題の解決に役立つことを願っています。

于 2014-05-09T06:04:57.110 に答える