diff --git a/docs/guide/caching-data.md b/docs/guide/caching-data.md index 1a95f79..cf40fbc 100644 --- a/docs/guide/caching-data.md +++ b/docs/guide/caching-data.md @@ -267,7 +267,7 @@ Query caching can be used for [DAO](db-dao.md) as well as [ActiveRecord](db-acti Query caching has three global configurable options through [[yii\db\Connection]]: * [[yii\db\Connection::enableQueryCache|enableQueryCache]]: whether to turn on or off query caching. - It defaults to false. Note that to effectively turn on query caching, you also need to have a valid + It defaults to true. Note that to effectively turn on query caching, you also need to have a valid cache, as specified by [[yii\db\Connection::queryCache|queryCache]]. * [[yii\db\Connection::queryCacheDuration|queryCacheDuration]]: this represents the number of seconds that a query result can remain valid in the cache. You can use 0 to indicate a query result should diff --git a/framework/db/Command.php b/framework/db/Command.php index ebbbaca..e098a92 100644 --- a/framework/db/Command.php +++ b/framework/db/Command.php @@ -852,7 +852,6 @@ class Command extends Component Yii::endProfile($token, 'yii\db\Command::query'); } catch (\Exception $e) { Yii::endProfile($token, 'yii\db\Command::query'); - $this->db->resetQueryCacheInfo(); throw $this->db->getSchema()->convertException($e, $rawSql); } diff --git a/framework/db/Connection.php b/framework/db/Connection.php index 8fb0604..06bbf54 100644 --- a/framework/db/Connection.php +++ b/framework/db/Connection.php @@ -204,11 +204,12 @@ class Connection extends Component * @var boolean whether to enable query caching. * Note that in order to enable query caching, a valid cache component as specified * by [[queryCache]] must be enabled and [[enableQueryCache]] must be set true. + * Also, only the results of the queries enclosed within [[cache()]] will be cached. * @see queryCache * @see cache() * @see noCache() */ - public $enableQueryCache = false; + public $enableQueryCache = true; /** * @var integer the default number of seconds that query results can remain valid in cache. * Use 0 to indicate that the cached data will never expire. @@ -399,6 +400,7 @@ class Connection extends Component * Use 0 to indicate that the cached data will never expire. * @param \yii\caching\Dependency $dependency the cache dependency associated with the cached query results. * @return mixed the return result of the callable + * @throws \Exception if there is any exception during query * @see enableQueryCache * @see queryCache * @see noCache() @@ -406,9 +408,14 @@ class Connection extends Component public function cache(callable $callable, $duration = null, $dependency = null) { $this->_queryCacheInfo[] = [$duration === null ? $this->queryCacheDuration : $duration, $dependency]; - $result = call_user_func($callable, $this); - array_pop($this->_queryCacheInfo); - return $result; + try { + $result = call_user_func($callable, $this); + array_pop($this->_queryCacheInfo); + return $result; + } catch (\Exception $e) { + array_pop($this->_queryCacheInfo); + throw $e; + } } /** @@ -430,6 +437,7 @@ class Connection extends Component * @param callable $callable a PHP callable that contains DB queries which should not use query cache. * The signature of the callable is `function (Connection $db)`. * @return mixed the return result of the callable + * @throws \Exception if there is any exception during query * @see enableQueryCache * @see queryCache * @see cache() @@ -437,9 +445,14 @@ class Connection extends Component public function noCache(callable $callable) { $this->_queryCacheInfo[] = false; - $result = call_user_func($callable, $this); - array_pop($this->_queryCacheInfo); - return $result; + try { + $result = call_user_func($callable, $this); + array_pop($this->_queryCacheInfo); + return $result; + } catch (\Exception $e) { + array_pop($this->_queryCacheInfo); + throw $e; + } } /** @@ -461,16 +474,6 @@ class Connection extends Component } /** - * Cleans up the query cache information. - * This method is used internally by [[Command]]. - * @internal - */ - public function resetQueryCacheInfo() - { - $this->_queryCacheInfo = []; - } - - /** * Establishes a DB connection. * It does nothing if a DB connection has already been established. * @throws Exception if connection fails