多次使用Yii :: app() - > db的开销?

时间:2013-02-26 12:03:14

标签: yii

如果我必须连续多次查询,最好这样做:

$connection = Yii::app()->db;

一次......然后继续使用$ connection,否则如果我有多个这样的函数就会有开销:

function mainFunction() {
  $dbResult1 = dbresult1();
  $dbResult2 = dbresult2();    
  $dbResult2 = dbresult3();
}

function dbresult1() {
   $connection = Yii::app()->db;
   // do stuff
   return $result;
}

function dbresult2() {
   $connection = Yii::app()->db;
   // do stuff
   return $result;
}

function dbresult3() {
   $connection = Yii::app()->db;
   // do stuff
   return $result;
}

这样做会更好:

function mainFunction() {
  $connection = Yii::app()->db;
  // do stuff with $connection for $dbResult1
  // do stuff with $connection for $dbResult2
  // do stuff with $connection for $dbResult3
}

1 个答案:

答案 0 :(得分:2)

您可以跟踪源代码,看看在致电Yii::app()->db时会发生什么:

Yii::app()返回app的静态YiiBase属性。您可以看到源代码here

public static function app()
{
    return self::$_app;
}

Yii::app()->db在这里它会变得更有趣,因为有些东西会被抬起来。您可以看到源代码here

public function getDb()
{
    return $this->getComponent('db');
}

getComponent()CModule找到源代码here的方法。

public function getComponent($id,$createIfNull=true)
{
    if(isset($this->_components[$id]))
        return $this->_components[$id];
    elseif(isset($this->_componentConfig[$id]) && $createIfNull)
    {
        $config=$this->_componentConfig[$id];
        if(!isset($config['enabled']) || $config['enabled'])
        {
            Yii::trace("Loading \"$id\" application component",'system.CModule');
            unset($config['enabled']);
            $component=Yii::createComponent($config);
            $component->init();
            return $this->_components[$id]=$component;
        }
    }
}

如您所见Yii::app()->db会导致一些方法调用和数组查找。如果性能非常关键,您可能应该缓存数据库实例。另外,我的目标是编写干净且可读的代码,而不关心这些小调整。