yg

yg

这家伙有点懒,还没写个性签名!

  • 财富值40
  • 威望值0
  • 总积分50

个人信息

  • 回复了 的回答

    ActiveRecord有个getDb方法,你可以重写他

    public static function getDb()
    {
        return Yii::$app->getDb();
    }
    

    其他它最终调用的是Application的getDb方法

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

    所以,你可以根据你自己的业务,然后重写这个方法,返回你想要的db。
    最好自己写个类,比如:

    class BackBaseActiveRecord extends ActiveRecord{
    
    }
    

    然后让你所有的model都继承BackBaseActiveRecord,这样你在BackBaseActiveRecord中重写getDb方法

    你试试看行不行

    在我自己这个类BackBaseActiveRecord 里面怎么去区分请求过来的是写操作 还是读操作呢 我要在这个类里面去区分读操作让他执行从库 写操作执行主库

  • 这样能把所有的读写操作分离吗? 写主库 读从库?

  • 回复了 的回答

    ActiveRecord有个getDb方法,你可以重写他

    public static function getDb()
    {
        return Yii::$app->getDb();
    }
    

    其他它最终调用的是Application的getDb方法

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

    所以,你可以根据你自己的业务,然后重写这个方法,返回你想要的db。
    最好自己写个类,比如:

    class BackBaseActiveRecord extends ActiveRecord{
    
    }
    

    然后让你所有的model都继承BackBaseActiveRecord,这样你在BackBaseActiveRecord中重写getDb方法

    你试试看行不行

    我用的是yii1.1版本 我先按照您这个方法试试

  • 回复了 的回答

    首先,你得配置多个db

    
    return [
        // ...
        'components' => [
            // 配置主库
            'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=mydatabase', 
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
            ],
            //可以配置多个从库,只要负责读
            'dbread' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=mydatabase2', 
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
            ],
        ],
        // ...
    ];
    
    

    接下来,如果你的业务处理是读取的,你就获取读取的实例:

    $connection2 = \Yii::$app->dbread;
    

    如果是需要写的业务,你就获取可读写的实例

    $connection2 = \Yii::$app->db;
    

    我明白您的思路 关键是我项目里 基本都用的是AR操作的数据库列如: Member::model()->findByPk($id); 这样的操作怎么去区分呢?

  • 回复了 的回答
    • CDbConnection 不用显式的关闭连接.Yii会管理的.
    • 多个ar类使用不同的db连接,可以在配置文件中设置数据库连接的不同组件,然后在ar的类中重构getDbConnection方法,也可以直接用yii组件的方式使用db连接.

    哥 有例子吗? 或者相关文档

  • 提出了问题
    多个数据库 读写分离怎么配置呢?
  • 多个数据库 读写分离怎么配置呢?

  • 多个数据库 读写分离怎么配置呢?

  • 多个数据库 读写分离怎么配置呢?

  • 回复了 的回复

    我记得是直接用config来实现的,不需要在AR层做修改。

    我在配置文件里配的 但是不起作用,并且程序访问不到数据库了

    'db'=>array(
            'class'=>'DbConnectionMan',//Specify it,instead of CDbConnection,other options is same as CDbConnection
            'connectionString' => 'mysql:host=192.168.207.132:3306;dbname=eyisheng',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '123456',
            'charset' => 'utf8',
            'tablePrefix' => 'dv_',
            'enableSlave'=>true,//Read write splitting function is swithable.You can specify this value to false to disable it.
            'slaves'=>array(//slave connection config is same as CDbConnection
                array(
                    'connectionString'=>'mysql:host=192.168.207.133:3306;dbname=eyisheng',
                    'username'=>'root',
                    'password'=>'123456',
                     'tablePrefix' => 'dv_',
                )
            ),
        ),
    
职场新人 等级规则
50/100
资料完整度
0/100
用户活跃度
0/100

Ta的关注

0

Ta的粉丝

2

Ta的访客

0