我们在 Symfony 1.4/ Propel 1.4 中有一个现有项目(SNS 网站+android/Iphone 游戏)
我们在数据库服务器(比如 DB1)上遇到了额外的负载。我们正在做 DB 优化,但作为直接的解决方案,我们决定再创建一个 DB 服务器,因为 DB2 始终是 DB1 的精确副本。目前我们只有 DB1,用于读写操作。
现在我们需要将所有读取操作移至 DB2,并保持 DB1 上的写入操作(通常在事务中)与现在一样。
进行这些更改的可能方法是什么(在没有太多停机时间的生产服务器上),如果可能的话,只需最少的代码更改。
在第一条评论后编辑
基于 J0k 和其他一些链接给出的链接,我已经在本地开发环境中完成了以下操作。
- 创建了一个测试 symfony 1.4 项目
更新 database.yml 如下
all: propel: class: sfPropelDatabase param: classname: PropelPDO dsn: 'mysql:host=localhost;dbname=wzo;' username: root password: mysql encoding: utf8 persistent: true pooling: true slaves: slave1: dsn: 'mysql:host=localhost;dbname=wzoslv;' username: root password: mysql encoding: utf8
其中数据库
wzoslv
是数据库的精确副本,wzo
除了一个测试条目中的更改。在表格odd_play
第 26 行 (PK) 列result
条目是WON1
和WON
分别。运行 symfony 任务
php symfony propel:build-schema php symfony propel:build-model php symfony cc
创建了一个模块并添加了以下代码:
class wzoActions extends sfActions { public function executeIndex(sfWebRequest $request) { $con_write = Propel::getConnection(OddPlayPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); $con_read = Propel::getConnection(OddPlayPeer::DATABASE_NAME, Propel::CONNECTION_READ); $oddPlay = OddPlayPeer::retrieveByPK(26,0,$con_write); echo "on write connection, result=".$oddPlay->getResult(); $oddPlayRead = OddPlayPeer::retrieveByPK(26,0,$con_read); echo "<br/>on Read connection, result=".$oddPlayRead->getResult(); exit; $this->setLayout('layout'); } }
在浏览器中运行
http://local.sftest.com/index.php/wzo/index
,输出是,on write connection, result=WON //正确的预期输出
on Read connection, result=WON //不正确。那应该是 WON1
我想OddPlayPeer::DATABASE_NAME
在创建读/写连接时通过是问题,但在线示例中是如何建议的。有人可以建议我在哪里犯错吗?
编辑:更多输入
我更新了调试回声lib\vendor\symfony\lib\plugins\sfPropelPlugin\lib\vendor\propel\Propel.php
以检查它是如何返回连接的。发现它正在进入以下 if(第 544-549 行)
$slaveconfigs = isset(self::$configuration['datasources'][$name]['slaves']) ? self::$configuration['datasources'][$name]['slaves'] : null;
if (empty($slaveconfigs)) {
echo "inelseifif<br/>";// no slaves configured for this datasource
self::$connectionMap[$name]['slave'] = false;
return self::getConnection($name, Propel::CONNECTION_WRITE); // Recurse to get the WRITE connection
}
哪里$slaveconfigs
是空的,所以返回写连接。现在的问题是,为什么 slaveconfigs 是空的?
我还尝试按照旧论坛中的定义编辑 sfDatabaseConfigHandler.class.php,但这样做会在某处破坏 symfony,并且不会在 Web 甚至日志中显示任何内容。