Yii框架 多数据库、主从、读写分离
Yii是可以在配置文件里声明多个数据库连接,然后通过Yii::app()->db1,Yii::app()->db2...来访问它们,并且也实现了更高级(自动)的主从数据库功能。
最近因为一个项目的关系,要通过Yii实现动态从库的功能,即通过数据库中的配置从动态的从库中操作数据。比如从主库查出当前用户时使用的db1数据库,那么操作的相关数据就应该是db1库的,如果另一用户是db2那么操作的就是db2库的数据,如此来实现主从库的功能。简单的可以叫做分库拆表。
实现方法:
1. 在主配置文件 (main.php) 中配置多个数据库连接:

注意,第二个以后的db数组中一定要写上class参数,让Yii 知道你在定义一个数据库连接对象,不然会报错。
一旦我们这样定义以后,就可以通过Yii::app()->db2 来指向第二个数据库了。
2. 根据配置动态的重载 GetDbConnection() 方法
因为每个Model都是(直接或者间接地)继承自基类CActiveRecord的,因此,都包含GetDbConnection()这个方法,GetDbConnection()返回一个数据库连接对象的句柄。我们需要在模型(model)里面通过重载这个方法来返回我们需要的数据库对象。
然后,假设我们新建了一文件 : protected/components/MyActiveRecord.php ,然后在你的所有要用db2这个数据库的model里extend MyActiveRecord 而不是 CActiveRecord 。
这里我们是通过扩展Yii通用类来定义一个新的类,而不是在每个模型里面都重载 getDbConnection 方法,这样做的好处是更大程度上的代码重用,节省时间。
/ protected/components/MyActiveRecord.php
class MyActiveRecord extends CActiveRecord { public function getDbConnection()
{
if(self::$db!==null)
return self::$db;
else
{
//这里就是我们要修改的
self::$db=Yii::app()->getComponent('db2');
//self::$db=Yii::app()->db2;
if(self::$db instanceof CDbConnection)
return self::$db;
else
throw new CDbException(Yii::t('yii','Active Record requires a "db2" CDbConnection application component.'));
}
}
...........
}
3. 通过Gii生成Model的时候使用新的ActiveRecord类
// protected/models/Ad.php
class Ad extends MyActiveRecord {
...
}
如此继承的类都会根据配置动态的操作对应数据库的数据了。
参考:
http://ihacklog.com/post/how-to-connect-to-two-or-more-databases-simutaneously.html
http://www.yiiframework.com/wiki/78/multiple-databases-and-multiple-domains/
http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii/
更多:http://lostphp.com/blog/648.html
Yii框架 多数据库、主从、读写分离的更多相关文章
- 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现
回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramew ...
- 基于 EntityFramework 的数据库主从读写分离服务插件
基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1 版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 ...
- 基于 EntityFramework 的数据库主从读写分离架构 - 目录
基于 EntityFramework 的数据库主从读写分离架构 回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目 ...
- 基于 EntityFramework 的数据库主从读写分离架构(2)- 改进配置和添加事务支持
回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramew ...
- 基于 EntityFramework 的数据库主从读写分离
现在刚开始来研究EntityFramwork,起初是在vs2012中通过工具来创建EF ,但是对我这种不熟悉菜鸟来说 有很多业务用EF做出来还是有点难度的,今天来手动搭建一个EF框架,大神勿喷
- MySQL搭建主从数据库 实现读写分离
首先声明,实际生产中,网站为了提高用户体验,性能等,将数据库实现读写分离是有必要的,我们让主数据库去写入数据,然后当用户查询的时候,然后在从数据库读取数据,故能减轻数据库的压力,实现良好的用户体验! ...
- Amoeba搞定mysql主从读写分离
前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...
- Amoeba实现mysql主从读写分离
Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...
- CRL快速开发框架4.4版发布,支持主从读写分离
经过一些调整和优化,4.3已经运行在生产环境,对于不久将会遇到的查询性能,读写分离需求列上日程 读写分离需求 对于一个数据库作了主从发布/订阅,主库为DB1,从库为DB2 所有写入通过DB1,所有查询 ...
- Mycat - 实现数据库的读写分离与高可用
前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:“读课文第三段”.我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:“同学有什么问题吗?”,我 ...
随机推荐
- [CodeForce]356D Bags and Coins
已知有n个包,和总共s个钱币. n,s<=70000. 每个包可以装钱币,还可以套别的包.每个包中的钱数等于 所有套的包的钱数 加上 自己装的钱. 所有的钱都在包内. 问给定每个包中的钱数,输出 ...
- JAAS authentication in Tomcat example--reference
In this tutorial you will learn how to configure JAAS authentication in Tomcat using the HTTP Basic ...
- myEclipse新建jsp,默认编码
修改地方在: myeclipse →fiter and editor →jsp
- Maven学习总结——聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- Ant学习笔记(2) 在Eclipse中使用Ant
Eclipse默认提供了对Ant的支持,在Eclipse中不需要安装任何插件就能直接编辑和运行Ant.Eclipse中包含了一个Ant脚本编辑器,Ant脚本编辑器提供了对Ant脚本的语法搞来高亮.自动 ...
- Codeforces 552E - Vanya and Brackets【表达式求值】
给一个只有加号和乘号的表达式,要求添加一对括号使得最后结果最大.表达式长度5000,乘号最多12个,表达式中数字只有1位. 左括号一定在乘号右边,右括号一定在乘号左边,因为如果不是这样的话,一定可以调 ...
- 11.3 afternoon
迭代40 #include<cstdio> #include<cstring> using namespace std; int n,sum,falg; ],c[]; void ...
- webservice 发布到外网的时候
在web.config的<system.web></system.web>中间加入如下配置节内容<webServices> <protoco ...
- List指定字段赋特定值(非循环) asp.net
List<Cart> cartd=cartd.Where(p => (p.Id= "123").Length > -1).ToList(); 把Id的值都赋 ...
- ActionScript:Resampling PCM data
使用基于flash的麦克风录音,如果想在获取完PCM采样数据后,通过Sound马上回放,必须经过resampling.(注意:如果录音是采用的44KHz的话,则不需要) 因此,需要as实现一个简便的函 ...