我正在寻找设置Doctrine 2的不同方式来使用MySQL的主/从连接.设置将使一个主数据库具有多个从属数据库.所有SELECT语句都应来自随机的实时从站,并且任何UPDATE,INSERT,DELETE语句都将始终委派给主连接.
有没有人以这种方式设置Doctine 2或者对如何处理它有任何想法?
Doctrine2现在在\ Doctrine\DBAL\Connections命名空间中有一个MasterSlaveConnection.
编辑: 除非这篇文章不起作用,否则请阅读以下内容
不再需要一个上载器,dbal配置将自己带走奴隶.例如
connections:
default:
driver: %database_driver%
host: %database_host%
dbname: %database_name%
user: %database_user%
password: %database_password%
slaves:
slave1:
host: %database_slave1%
dbname: %database_name%
user: %database_user%
password: %database_password%
Run Code Online (Sandbox Code Playgroud)
如果上述方法无效,请尝试此操作
简单的东西,只需在每个主机之间放置管道(|)
default:
driver: %database_driver%
host: %database_host%|%database_slave%|%database_slave2%
port: 3306
dbname: %database_name%
user: %database_user%
password: %database_password%
wrapper_class: \Foo\Bar\Symfony\Doctrine\Connections\MasterSlave
<?php
namespace Foo\Bar\Symfony\Doctrine\Connections;
use \Doctrine\DBAL\Connections\MasterSlaveConnection;
use Doctrine\DBAL\Connection,
Doctrine\DBAL\Driver,
Doctrine\DBAL\Configuration,
Doctrine\Common\EventManager,
Doctrine\DBAL\Event\ConnectionEventArgs,
Doctrine\DBAL\Events,
Doctrine\DBAL\Cache\QueryCacheProfile;
class MasterSlave extends MasterSlaveConnection
{
public function __construct(array $params, Driver $driver, Configuration $config = null, EventManager $eventManager = null)
{
$tempParams = array(
'master' => array()
, 'slaves' => array()
, 'driver' => $params['driver']
);
$hosts = explode('|', $params['host']);
unset($params['host']);
foreach($hosts as $num => $host)
{
$params['host'] = $host;
if($num == 0)
{
$tempParams['master'] = $params;
}
else
{
$tempParams['slaves'][] = $params;
}
}
if(!isset($tempParams['master']['driver']))
$tempParams['master']['driver'] = "pdo_mysql";
foreach($tempParams['slaves'] as $k => $slave)
{
if(!isset($slave['driver']))
$tempParams['slaves'][$k]['driver'] = "pdo_mysql";
}
parent::__construct($tempParams, $driver, $config, $eventManager);
}
public function executeQuery($query, array $params = array(), $types = array(), QueryCacheProfile $qcp = null)
{
try
{
return parent::executeQuery($query, $params, $types, $qcp);
}
catch(\Exception $e)
{
$logger = new \Uelib\Core\Logger();
$message = $e->getMessage() . "\nSql: " . $query . "\nParams: \n" . print_r($params, true);
$logger->log($message);
throw $e;
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,原则 2 中没有对此的内置支持。
看起来(至少对于 mysql 来说)这个问题最终将在其他地方得到解决。要么在mysql_proxy中,要么通过最近使用mysqlnd(php 的 mysql 本机驱动程序扩展)的一些工作
由于这些都还没有准备好迎接黄金时段(尽管 mysql_proxy 可能已经准备好了),不幸的是,您唯一的直接选择是开始查看 Doctrine DBAL,并扩展内置类以智能地处理事情——这意味着它可能是一个很好的选择。想法检测当前请求是否已完成任何写入操作,然后强制任何后续读取使用主服务器,避免任何与复制延迟相关的问题。
希望我们能在接下来的 6-12 个月内看到 Doctrine 团队提供更正式的解决方案。但如果你现在需要它,那就 DIY 吧,AFAIK。
归档时间: |
|
查看次数: |
6738 次 |
最近记录: |