回覆列表
  • 1 # 使用者834195712159

    當採用原生態的sql語句進行寫入操作的時候,要用execute,讀操作要用query。

    MySQL資料主從同步還是要靠MySQL的機制來實現,所以這個時候MySQL主從同步的延遲問題是需要最佳化,延遲時間太長不僅影響業務,還影響使用者體驗。

    thinkphp核心類Thinkphp/library/Model.class.php 中,query 方法

    呼叫Thinkphp/library/Think/Db/Driver/Mysql.class.php

    /**

    * SQL查詢

    * @access public

    * @param string $sql SQL

    * @param mixed $parse 是否需要解析SQL

    * @return mixed

    */

    public function query($sql,$parse=false) {

    if(!is_bool($parse) && !is_array($parse)) {

    $parse = func_get_args();

    array_shift($parse);

    }

    $sql = $this->parseSql($sql,$parse);

    return $this->db->query($sql);

    }

    呼叫Thinkphp/library/Think/Db/Driver/Mysql.class.php

    /**

    * 執行查詢 返回資料集

    * @access public

    * @param string $str sql指令

    * @return mixed

    */

    public function query($str) {

    if(0===stripos($str, "call")){ // 儲存過程查詢支援

    $this->close();

    $this->connected = false;

    }

    $this->initConnect(false);

    if ( !$this->_linkID ) return false;

    $this->queryStr = $str;

    //釋放前次的查詢結果

    if ( $this->queryID ) { $this->free(); }

    N("db_query",1);

    // 記錄開始執行時間

    G("queryStartTime");

    $this->queryID = mysql_query($str, $this->_linkID);

    $this->debug();

    if ( false === $this->queryID ) {

    $this->error();

    return false;

    } else {

    $this->numRows = mysql_num_rows($this->queryID);

    return $this->getAll();

    }

    }

    上面初始化資料庫連結時,initConnect(false),呼叫Thinkphp/library/Think/Db/Db.class.php,注意false、true程式碼實現。true表示直接呼叫主庫,false表示呼叫讀寫分離的讀庫。

    /**

    * 初始化資料庫連線

    * @access protected

    * @param boolean $master 主伺服器

    * @return void

    */

    protected function initConnect($master=true) {

    if(1 == C("DB_DEPLOY_TYPE"))

    // 採用分散式資料庫

    $this->_linkID = $this->multiConnect($master);

    else

    // 預設單資料庫

    if ( !$this->connected ) $this->_linkID = $this->connect();

    }

    /**

    * 連線分散式伺服器

    * @access protected

    * @param boolean $master 主伺服器

    * @return void

    */

    protected function multiConnect($master=false) {

    foreach ($this->config as $key=>$val){

    $_config[$key] = explode(",",$val);

    }

    // 資料庫讀寫是否分離

    if(C("DB_RW_SEPARATE")){

    // 主從式採用讀寫分離

    if($master)

    // 主伺服器寫入

    $r = floor(mt_rand(0,C("DB_MASTER_NUM")-1));

    else{

    if(is_numeric(C("DB_SLAVE_NO"))) {// 指定伺服器讀

    $r = C("DB_SLAVE_NO");

    }else{

    // 讀操作連線從伺服器

  • 中秋節和大豐收的關聯?
  • 燒本歌原文?