MySQL异常处理

跑数据流程这几天总是出错,暂时还没有精力重构,先处理一些紧急的问题吧。鉴于目前问题都出在MySQL执行查询出错的情况,决定对mysql_query进行封装。封装函数如下。

目前只处理2006错误,对于1317错误,只有重试的方法,以后再补充。

对于2006错误,需要重连MySQL,但是有一点需要注意的是,在重连之前一定要先关闭之前的连接,否则永远报2006错误

之前没写过异常处理,try{}catch(){},嘿嘿,用了一下就会了。

/**
 * @param $sql 需要执行的SQL语句
 * @param $link 数据库连接
 * @param $conn 使用线上还是线下数据库,默认为线下 online:线上 offline:线下
 */
function dh_mysql_query($sql, &$link=null, $db) {
    $i = 0;
    do{
        try{
            $ret = mysql_query($sql);
            if(!$ret){
                //抛出MySQL错误号
                $ec = mysql_errno();
                throw new Exception($ec);
            }
        }catch(Exception $e){
            //处理mysql错误号
            switch($e->getMessage()){
                case '2006':// MySQL Server has gone away
                    mysql_close($link);
                    if($db == "online"){
                        $link = connect_online();
                    }else {
                        $link = conn_db();
                    }
                    break;
                case '1317'://Query execution was interrupted
                    sleep(3);
                    break;
            }
        }
        $i ++;
    }while(!$ret && $i<5);

    if(!$ret){
        $ec = mysql_errno();
        $err = mysql_error();
        $desc = json_encode(array('event'=>'mysql query error','sql'=>$sql,'errno'=>$ec,'errmsg'=>$err,'debug_info'=>debug_backtrace(true)));
        write_log($desc);
        //curl_send_msg('13691102775',$desc);
        //exit($desc);
    }
    return $ret;
}

  以后再补充针对MySQL其他错误的处理方式

posted @ 2014-04-13 23:53  我就是熊吉  阅读(1572)  评论(0编辑  收藏  举报