以下のSELECTが実行時間10秒だった場合に、

5秒でタイムアウトさせたいと思ってます。

SQLite 関数のsqlite_busy_timeoutみたいな事をPDOで実行したいと
思っているのですが、うまく動きません。

該当のデータベースでロックが発生している場合に
SQLをwaitさせるのではなく、タイムアウトさせたいです。

$sql = "SELECT * FROM AAAAA";
$param = array();

$test = new PDO("mysql:dbname=DB_NAME;host=DB_HOST",$_SERVER['SCRIPT_NAME'],'');
$test->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$test->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
$test->setAttribute(PDO::ATTR_TIMEOUT,5);

$st = $test->prepare($sql);

わかる方、いたら教えて下さい。

回答の条件
  • 1人5回まで
  • 登録:2009/05/23 23:51:13
  • 終了:2009/05/30 23:55:02

回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/05/24 08:37:24

ポイント60pt

ERRMODE_EXCEPTION を設定しているので、下記のように try~catch でエラーイベントをキャッチアップしたらいかがでしょう。

try{
    $sql = "SELECT * FROM AAAAA";
    $param = array();
    $test = new PDO("mysql:dbname=DB_NAME;host=DB_HOST",$_SERVER['SCRIPT_NAME'],'');
    $test->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $test->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
    $test->setAttribute(PDO::ATTR_TIMEOUT,5);
    $st = $test->prepare($sql);

} catch (PDOException $err) {
//--タイムアウトエラー処理を記述する
}
id:hopefully

うまく動かないですね・・

うーーん・・

2009/05/26 14:10:04
id:user2864 No.2

user2864回答回数10ベストアンサー獲得回数12009/05/30 00:37:35

ポイント10pt

MySQLなら、MySQL側にtimeoutパラメータがありますのでそちらの秒数を5秒にされるとよいのではないでしょうか。

MySQLへログインして、以下のコマンドをrootユーザで実行してみてください。

ただし、再起動すると変更情報は失われますのでMySQLの設定ファイル(my.cnf)にも明記しておいてください、

set global wait_timeout=5;

set global innodb_lock_wait_timeout=5;

set global interactive_timeout=5;

set global table_lock_wait_timeout=5;

  • id:kn1967
    PDOによる抽象化と言ってもDB毎の差異があるから使ってないのだけど

    マニュアル見ると setAttribute に PDO::ATTR_TIMEOUT は無いので
    インスタンス生成時にオプションで指定してやるしか無いと思うのだけど
    どうだろう?

    my.cnf の値が優先されてるなんて事かもしれないけど、これもどうだろう?

    使ってないので、以上、疑問点だけ・・・。
  • id:pahoo
    「うまく動かない」というのは、どういう状況でしょうか。
    エラーメッセージが表示されますか?
    期待通りにタイムアウトしないのですか?
    PHPのバージョンは?
    MySQLのバージョンは?
  • id:hopefully
    PHP5.2.6
    MYSQL 5.1.30

    ずっと、SELECTが実行されてます。
    エラーメッセージも出ないですね。

    MYSQLのGET_LOCKで確認して、問題なければ、
    実行とかにした方がいいのでしょうか?
  • id:pahoo
    処理は正常――5秒以内にすべての処理が終わっている――ということではないのでしょうか?
  • id:hopefully
    いえ、SELECTを実行して、5秒以上処理は戻りを待ってます。

    SELECTの結果が15秒位で、返ってきます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません