如果我必须连续多次查询,最好这样做:
$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
}
答案 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
会导致一些方法调用和数组查找。如果性能非常关键,您可能应该缓存数据库实例。另外,我的目标是编写干净且可读的代码,而不关心这些小调整。