kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

TOOL更新_DBマネージャクラス。DBコネクションはDBにアクセスするときまで取らないように修正した。

TOOL更新_DBマネージャクラス。DBコネクションはDBにアクセスするときまで取らないように修正した。
アイディアが浮かんだ。DBマネージャ。getInstance($dsn=null, $uid='dummy')でDBコネクションを取っていた。、、、が。、、そうだ、すぐに取ることはない。DBにアクセスするときに取れば、プログラムがDBアクセスしないとき無駄なDBコネクトがなくなる。ということで。修正した。以下の文章の『2.・・・』を追加した。http://d.hatena.ne.jp/kazpgm/20100309/1268152282 (TOOL更新_DBマネージャクラス。うごいたので。ここに更新する。)を直接修正した。
以下が修正内容

■DbManager.php 修正
// DBマネージャ
//  1.必ず1コネクション(シングルトン)とする
//  2.DBコネクションは、DBに最初にアクセスするときまで取得しない。
//   補足:アクセスしなければDBコネクションを取得しない
//      commit()、rollBack()はDBコネクションがない場合、何もしない。
//  3.デバックしやすくするためSQLログを出力する。
//   ・Zend_Dbを直接使わずに一度SQLを作成してから使う。
//  4.ControllerBaseクラスでExceptionを拾うのでここでは拾わない。

class DbManager {
<<追加>>
    protected $_dsn = '';           // データセットネーム
    protected $_begin = '';         // 初期値=''、$_dbがnullのときでかつ、beginTransactionメソッドのとき'begin'を設定する。
                                    // DBアクセスがあったとき、$_begin='begin'のときはbeginしてからDBアクセスを行う。その後''に戻す。

<<修正前>>
    /**
     * Loggerなどを設定する。<br>
     * @param    $dsn    データセット
     * @param    $uid    ユーザID
     */
    protected function _setLoggerEtc(&$dsn, &$uid) {
        $this->_db = $this->_getConnection($dsn);
        $this->_uid = $uid;  // ユーザID
        // ログ
        $this->_logger = new AppLogr(APP.'/log/', DEBUG_FLG);
    }
    /**
     * DBコネクションを設定する。<br>
     * @param    $dsn    データセット
     * @param    $uid    ユーザID
     */
    private static function _getConnection(&$dsn) {
        //$config = new Zend_Config_Ini(APP.'/db.ini', 'database');
        $db = Zend_Db::factory('Pdo_Mysql', $dsn);
        $db->getConnection();
        $db->setFetchMode(Zend_Db::FETCH_OBJ);
        $db->query('SET names utf8');
        $db->query("SET time_zone = '+9:00'");
        $db->query("set autocommit = 0");
        return $db;
    }
<<修正後>>
    /**
     * Loggerなどを設定する。<br>
     * @param    $dsn    データセット
     * @param    $uid    ユーザID
     */
    protected function _setLoggerEtc(&$dsn, &$uid) {
        $this->_dsn = $dsn;  // DBコネクト情報
        $this->_uid = $uid;  // ユーザID
        // ログ
        $this->_logger = new AppLogr(APP.'/log/', DEBUG_FLG);
    }
    /**
     * DBコネクションを設定する。<br>
     */
    private function _getConnection() {
        if (empty($this->_db)) {
            if (empty($this->_dsn)) {
                // 例外をスローします。
                throw new SysException('Invalid $dsn. please call getInstance($dsn, $uid)');
            }
            $db = Zend_Db::factory('Pdo_Mysql', $this->_dsn);
            $db->getConnection();
            $db->setFetchMode(Zend_Db::FETCH_OBJ);
            $db->query('SET names utf8');
            $db->query("SET time_zone = '+9:00'");
            $db->query("set autocommit = 0");
            $this->_db = $db;
            if ($this->_begin == 'begin') {
                $this->beginTransaction(); // DBアクセスがあったとき$_begin='begin'のときはbeginしてからDBアクセスを行う。
                $this->_begin = '';        // ''に戻す。
            }
        }
    }

<<追加>>
    /**
     * DbConnectionを設定する。<br>
     */
    protected function _getConnection() {
        if (empty($this->_db)) {
            if (empty($this->_dsn)) {
                // 例外をスローします。
                throw new SysException('Invalid $dsn. please call getInstance($dsn, $uid)');
            }
            $this->_db = $this->_getConnection($dsn);
        }
    }

<<修正前>>
    public function getDb() {
        return $this->_db;
    }
<<修正後>>
    public function getDb() {
        $this->_getConnection();
        return $this->_db;
    }
    以下のメッソドも同様にした。
      ・public function getAll($sql, $ary=array()) {
      ・public function getRow($sql, $ary=array()) {
      ・public function getOne($sql, $ary=array()) {
      ・public function query($sql, $ary=array()) {

<<修正前>>
    public function beginTransaction()
    {
        $sql = 'begin';
        $this->_outSqlLog($sql, 'beginTransaction');
        return $this->_db->query($sql);
    }
<<修正後>>
    public function beginTransaction()
    {
        if (empty($this->_db)) {
            $this->_begin = 'begin'; // $_dbがnullのとき'begin'を設定する。
            return null;
        }
        $sql = 'begin';
        $this->_outSqlLog($sql, 'beginTransaction');
        return $this->_db->query($sql);
    }

<<修正前>>
    public function commit()
    {
        $sql = 'commit';
        $this->_outSqlLog($sql, 'commit');
        return $this->_db->query($sql);
    }
<<修正後>>
    public function commit()
    {
        if (empty($this->_db)) {
            $this->_begin = ''; // $_dbはnullに戻す。
            return null;
        }
        $sql = 'commit';
        $this->_outSqlLog($sql, 'commit');
        return $this->_db->query($sql);
    }
    以下のメッソドも同様にした。
        ・public function rollBack()

6/8 20:30-21:30 DBコネクションは、DBに最初にアクセスするときまで取得しない。補足:アクセスしなければDBコネクションを取得しない。commit()、rollBack()はDBコネクションがない場合、何もしない。とした。

6/8 23:00-0:00 、beginTransactionメソッドのとき、すぐにDBコネクション作らないようにした。実際にDBアクセスする前にコネクションを取る。

6/8 21:30-23:00 シーケンス作成用DBコネクション取得ロジックを getDbSeqメソッドに直接書いた。http://d.hatena.ne.jp/kazpgm/20100315/1268667599(TOOL更新_DBマネージャクラス。に、置き換えている。「AppDbFunctions」(DB関数群)クラス作成した。ここに更新する。)を直接修正した。