Dúvida relacionada ao CDbConnection

Galera, me tirem uma dúvida: Existe algum design pattern que fala que toda conexão com o banco deve ser singleton?

Como funciona isso com o YII?

veja esse método:

setActive:




public function setActive($value)

	{

		if($value!=$this->_active)

		{

			if($value)

				$this->open();

			else

				$this->close();

		}

	}



Pelo o que eu entendi o CDBConnection SEMPRE abre uma nova conexão…é isso?

Eu tenho um problema, eu criei um CBehavior, ou CApplicationComponent, no qual conecta em um outro banco para fazer a integração…porém toda vez que o cara dá F5 na página ele reconecta com o banco! Eu consigo fazer uma gambiarra definindo um "singleton" guardando a variável dentro do Yii::app()->user->setState…gambiarra FEIA…mas mesmo assim funciona, porém…quando eu uso o createCommand, ele sempre abre uma nova conexão…=(

Eric,

da uma olhada no método setActive, ele possui um if q verifica $this->_active e essa propriedade é alterada no método open() e no método close()

Só abre uma conexão se $this->_active for false e a $value for true, e fexa caso seja o contrário.


	/**

	 * Opens DB connection if it is currently not

	 * @throws CException if connection fails

	 */

	protected function open()

	{

		if($this->_pdo===null)

		{

			if(empty($this->connectionString))

				throw new CDbException(Yii::t('yii','CDbConnection.connectionString cannot be empty.'));

			try

			{

				Yii::trace('Opening DB connection','system.db.CDbConnection');

				$this->_pdo=$this->createPdoInstance();

				$this->initConnection($this->_pdo);

				$this->_active=true;

			}

			catch(PDOException $e)

			{

				if(YII_DEBUG)

				{

					throw new CDbException(Yii::t('yii','CDbConnection failed to open the DB connection: {error}',

						array('{error}'=>$e->getMessage())),(int)$e->getCode(),$e->errorInfo);

				}

				else

				{

					Yii::log($e->getMessage(),CLogger::LEVEL_ERROR,'exception.CDbException');

					throw new CDbException(Yii::t('yii','CDbConnection failed to open the DB connection.'),(int)$e->getCode(),$e->errorInfo);

				}

			}

		}

	}

meu problema está aqui:


public function __sleep()

	{

		$this->close();

		return array_keys(get_object_vars($this));

	}

toda vez que finaliza a consulta ele cai aí e fecha a conexão, tendo que abrir uma nova e demorando em torno de 3 segundos (muuuuuuita coisa)

Você está colocando seu objeto na função serialize() em algum momento, por isso ele chama o método __sleep().

Lembre-se que no PHP toda as variáveis são destruídas no fim da conexão.