【问题标题】:Yii 1.1 Use two database connection at same timeYii 1.1 同时使用两个数据库连接
【发布时间】:2015-08-28 10:43:19
【问题描述】:

我想同时使用到数据库连接。我有两台服务器具有相同的数据库。我想同时更新两个数据库,即在我的应用程序的添加/更新/删除上,两个数据库都需要相应地更新。我在 main.php 中添加了以下内容

        'db2'=>array(
        'connectionString' => 'mysql:host=hostname;dbname=dbanme',
        'emulatePrepare' => true,
        'username' => 'username',
        'password' => 'password',
        'charset' => 'utf8',
        'tablePrefix' => 'tbl_',
        'enableProfiling'=>true,
        'enableParamLogging'=>true,
        'class' => 'CDbConnection',
        ),

然后在我的控制器中添加操作:

    public function actionCreate()
    {
       $model=new TestTransaction;

       if(isset($_POST['TestTransaction']))
       {
            $originalDbConnection   = Yii::app()->db;
            $latin1DbConnection     = Yii::app()->db2;
            $model->attributes      = $_POST['TestTransaction'];
            if($model->save()) {
                Yii::app()->setComponent("db",$latin1DbConnection);
                $model->save();
                Yii::app()->setComponent("db",$originalDbConnection);
                $this->redirect(array('view','id'=>$model->id));    
            }
        }

        $this->render('create',array(
            'model'=>$model,
        ));
    }

但这不起作用。请帮帮我。

【问题讨论】:

  • 你到底为什么要这样做。为什么不做一些更强大的事情,比如数据库复制
  • 试试这个 - yii.at/ehwM15X & yii.at/JaUjsSR

标签: php yii


【解决方案1】:

这是因为AR模型缓存了DB对象。

public function getDbConnection()
{
    if(self::$db!==null)
        return self::$db;
    else
    {
        self::$db=Yii::app()->getDb();
        if(self::$db instanceof CDbConnection)
            return self::$db;
        else
            throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
    }
}

您可以手动设置模型 $db 属性。

【讨论】:

    【解决方案2】:

    尝试将setComponent的第三个参数设置为false:

    if($model->save()) {
        Yii::app()->setComponent("db",$latin1DbConnection, false); // set third parameter to false
        $model->save();
        Yii::app()->setComponent("db",$originalDbConnection, false);
        $this->redirect(array('view','id'=>$model->id));    
    }
    

    这将禁用新组件与旧组件的合并。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2014-03-06
      • 1970-01-01
      • 2022-07-26
      • 2013-10-26
      • 1970-01-01
      相关资源
      最近更新 更多