MySQLのリクエスト回数

タグ: MySQL
ポストマップでたまに下記エラーがでる。
User 'xxxxxxx' has exceeded the 'max_questions' resource (current value: 300000)
どうもMySQLへのリクエスト回数が1時間に30万回を超えると接続できなくなるようだ。
xserverに問い合わせしてみたけれど、その設定は上げられないようなので、解決策は、リクエスト回数を減らす仕組みにするか、専用サーバーを借りるということになりそう。
少し時間が経つと復帰するのだけれど、ここも含めて全部落ちちゃうので、なんとかはしたいな。

resource (current value: 300000)
で検索したら、死語調査がトップにでてきてびっくり。
kuwa
タイミング良く解決法を書いてくれてる方がいました。
http://d.hatena.ne.jp/irijon/2007011...

Userを複数つくって、接続時に振り分けるみたいな解決法。
これで落ちないハズ。
はじめまして。
max_questionsを検索してましたら、こちらのブログに辿り着きました。
日本のサイトで意外にこのエラーについて書かれてなかったので、こちらのエントリはとても参考になりました。
こちらにトラバをしたかったんですが、トラバアドレスが見当たらなかったので、コメント投稿で失礼しますね。
これからも度々お邪魔します、では。
ユーザー登録システムだったんですね。
上記のコメントは、私でした。
kuwa
ほんと、jonさんに感謝ですよ。

http://karasu.net/blog/598
にリンクしておいてくだされば、リファラーから表示させます。(まだ未実装ですがいずれ)
kuwa
ランダムでユーザーを選んでも、それが落ちてると繋がらないので、こんな感じにしてみた。これでユーザー5個が全部落ちるまで繋がるのだ。

$i = 0;
while(!$conn && $i < count($dbuser)){
  $conn = @mysql_connect($sv,$dbuser[$i],$dbpass);
  $i++;
}
mysql_select_db($dbname) or die('Sorry. Server is busy now.');
kuwa
あー、max_questionsで落ちた・・・
上のでは解決しない。
max_questionsで落ちる場合は、以下の判定が使えます。
max_questionsエラーは、クエリーキャッシュが行われた場合は表示されない仕様なので、
キャッシュされないクエリーとして'SELECT 1+1'を使っています。
(詳しくは、http://bugs.mysql.com/bug.php?id=242...

foreach (range(1,10) as $n){
  $db_user_candidate = "mysql_user$n";
  $test_conn = @mysql_connect(DB_SERVER, $db_user_candidate, DB_SERVER_PASSWORD);
  $test_result = mysql_query('SELECT 1+1',$test_conn);
  if (!$test_result){
    mysql_close($test_conn);
    continue;
  }else{
    mysql_close($test_conn);
    break;
  }
}
$db_user = $db_user_candidate; // use $db_user to connect mysql.

上の例だと、事前にmysql_user1〜mysql_user10というユーザを作成しています。
iPowerWebというレンタルサーバで動作確認しました。
kuwa
なんだかスバラシイ情報いただいた感じ。
ためしてみまっす!

iPowerWebも興味あるなあ
kuwa
max_questionsのエラーが出たので、ここぞとばかりテストしてみました。
確かに落ちません。ありがとうございまっす。
コメント: ( )
name:
ログインしておくと、後で編集が可能になります。