質問: 100 上記の数字(200, 100)の変更はしております。(と言いましても、1000ぐらいまでの数字でしか試しておりません。)また、関係ないとは思いますが、念の為「flush query cache;」もコードには組み込んでいます。しかし、現状では、同じ問題が発生しております。 [質問] webでは探しましたが、上記の2点以外での同問題の解決方法が見つかりませんでした。 質問は2点あります。 (1)自分でも行いましたが、数字の変更(200,100)を上限なく大きな数字(例えば、200000など)にした場合、問題は解決されるのでしょうか?その場合、別の問題は発生しますでしょうか? (2)上記の2条件以外での解決方法がありますでしょうか? 大変申し訳ないですが、ご教授をいただけたら幸いです。 よろしくお願いします。
回答: クライアントプログラムからMySQLを利用する際、 1. MySQLサーバーに接続する 2. その接続を利用して必要なだけクエリを投げる 3. 接続を閉じる という流れになります。ここで `Too many connections` とは同時に開いている接続が `max_connections` で設定された数を超えているというエラーです。この時、 * 実際にそれだけ同時に接続しなければならない(Webサービスなど) → `max_connections` を**増やして**、多くのコネクションを許容する * 何らかの問題で使われていない接続が残ってしまっている → `wait_timeout` を**短くして**、さっさとサーバー側から切断してしまう といった対応がとられます。ですから前述のエラーに対して `wait_timeout` を調節するとしたら短くすることになりますが、本来はクライアントが責任をもって適切なタイミングで切断するもので、タイムアウトは問題時のための予防線です。このエラーが恒常的に発生するなら、まずはその原因を調査し、使い方が間違っていないか、他の対処法がないか検討すべきです。 `max_connections` についても、多くの接続を維持するにはそれだけのリソースが必要になりますから、環境によってその上限は様々です。また、必要十分な数に抑えておくことで、前述のエラーで異常に気づきやすくなります。この値がよく紹介されているから、ではなく、動作させる環境やアプリケーションの要件に合わせて調整すべきです。 今回の場合、ひとつのプログラムの実行中にこのエラーが起きているようですから、使いまわしも切断もせず、新しい接続を多数作成している、いわゆるリソースリークが起きているのではと思います。もちろん `max_connections` を増やすことで済ますのも手ではありますが...。 もしそのあたりについて改めて質問されるのでしたら、問題のクエリを発行している部分のソースコードを添えて、[go](/questions/tagged/go "'go' のタグが付いた質問を表示") タグを付けて質問するとよろしいかと思います。