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関数群)クラス作成した。ここに更新する。)を直接修正した。